2000年NOIP全国联赛普及组NOIP全国联赛提高组
时间限制: 1 s
空间限制: 128000 KB
题目等级: 黄金 Gold
题目描述 Description
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
输入描述 Input Description
输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出描述 Output Description
只需输出以此字母开头的最长的“龙”的长度
样例输入 Sample Input
5
at
touch
cheat
choose
tact
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; }