题目描述
代码
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入输出格式
输入格式:
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式:
只需输出以此字母开头的最长的“龙”的长度
输入输出样例
输入样例#1:
5 at touch cheat choose tact a
输出样例#1:
23 (连成的“龙”为atoucheatactactouchoose)
说明
NOIp2000提高组第三题
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
1 /* 2 dfs 3 找从初始子串开始找 每个子串只能用一次 4 */ 5 #include<string> 6 #include<cstdio> 7 #include<iostream> 8 #define MAXN 30 9 10 using namespace std; 11 12 int f[MAXN]; 13 14 string s[MAXN],b; 15 16 int n,maxn,maxnn; 17 18 inline int pipei(string a,string b) { 19 if(a.length()==1) { 20 if(a[0]==b[0]) return b.length(); 21 else return 0; 22 } 23 else { 24 for(int i=1;i<a.length();i++) { 25 string t1=a.substr(a.length()-i); 26 string t2=b.substr(0,i); 27 if(t1==t2) return b.length()-i; 28 } 29 } 30 return 0; 31 } 32 33 inline void dfs(string a) { 34 for(int i=1;i<=n;i++) { 35 int t=pipei(a,s[i]); 36 if(t&&f[i]<2) { 37 f[i]++; 38 maxnn+=t; 39 if(maxnn>maxn) maxn=maxnn; 40 dfs(s[i]); 41 f[i]--; 42 maxnn-=t; 43 } 44 } 45 return; 46 } 47 48 int main() { 49 scanf("%d",&n); 50 for(int i=1;i<=n;i++) cin>>s[i]; 51 cin>>b; 52 dfs(b); 53 printf("%d\n",maxn); 54 return 0; 55 }