单词接龙是一个与咱们常常玩的成语接龙相相似的游戏,如今咱们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每一个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如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; }