單詞接龍

2000年NOIP全國聯賽普及組NOIP全國聯賽提升組
 時間限制: 1 s
 空間限制: 128000 KB
 題目等級: 黃金 Gold
 
 
 
題目描述 Description

    單詞接龍是一個與咱們常常玩的成語接龍相相似的遊戲,如今咱們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的「龍」(每一個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合爲一部分,例如beast和astonish,若是接成一條龍則變爲beastonish,另外相鄰的兩部分不能存在包含關係,例如at和atide間不能相連。flask

輸入描述 Input Description

   輸入的第一行爲一個單獨的整數n(n<=20)表示單詞數,如下n行每行有一個單詞,輸入的最後一行爲一個單個字符,表示「龍」開頭的字母。你能夠假定以此字母開頭的「龍」必定存在.app

輸出描述 Output Description

   只需輸出以此字母開頭的最長的「龍」的長度ide

樣例輸入 Sample Input

5spa

atcode

touchblog

cheat遊戲

chooseip

tactci

a

 

樣例輸出 Sample Output

23    

數據範圍及提示 Data Size & Hint

(連成的「龍」爲atoucheatactactouchoose)                                        

分類標籤 Tags 

 深度優先搜索 搜索 NOIP全國聯賽普及組 大陸地區 NOIP全國聯賽提升組 2000年
 
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,use[25];
string s1,f[25],q;
int asd(string o,string p)
{
    int m=0,s=0;
    string e=" ";
    for(int i=1;i<=p.size();i++)
    {
        m=0;
        for(int j=1;j<=i;j++)
            if(o[o.size()-1-i+j]==p[j-1])
                m++;
        if(m==i)
        {
            s=1;
            break;
        }
    }
    if(s==1)return m;
    return 0;
}
int dfs(string s)
{
    if(s.size()>=s1.size())s1=s;
    for(int i=1;i<=n;i++)
    {
        if(use[i]<2&&asd(s,f[i])!=0)
        {
            use[i]++;
            string t=s;
            for(int l=1;l<=asd(s,f[i]);l++)
                t.erase(t.size()-1,1);
            string k=t+f[i];
            dfs(k);
            use[i]--;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)cin>>f[i];
    cin>>q;
    dfs(q);
    cout<<s1.size()<<endl;
    return 0;
}
相關文章
相關標籤/搜索