單詞接龍是一個與咱們常常玩的成語接龍相相似的遊戲,如今咱們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的「龍」(每一個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合爲一部分,例如beast和astonish,若是接成一條龍則變爲beastonish,另外相鄰的兩部分不能存在包含關係,例如at和atide間不能相連。flask
輸入的第一行爲一個單獨的整數n(n<=20)表示單詞數,如下n行每行有一個單詞,輸入的最後一行爲一個單個字符,表示「龍」開頭的字母。你能夠假定以此字母開頭的「龍」必定存在.app
只需輸出以此字母開頭的最長的「龍」的長度ide
5spa
atcode
touchblog
cheat遊戲
chooseip
tactci
a
23
(連成的「龍」爲atoucheatactactouchoose)
#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; }