单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
输入描述 Input Description输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出描述 Output Description只需输出以此字母开头的最长的“龙”的长度
样例输入 Sample Input5
at
touch
cheat
choose
tact
a
样例输出 Sample Output
23
数据范围及提示 Data Size & Hint(连成的“龙”为atoucheatactactouchoose)
//max慎用,容易不匹配,特别是不太了解函数返回值的时候 //把string::npos的返回类型理解为unsigned int,wa了半天 //size_t,size_t,size_t重要的事说3遍 #include<cstdio> #include<iostream> #include<string> using namespace std; int n,cnt[30],ans; string s[30]; void dfs(string ss){ size_t pos; if(ans<ss.size()) ans=ss.size(); if(ss==s[n]){ for(int i=0;i<n;i++) if(s[i].find(ss)==0){ cnt[i]=1; dfs(s[i]); } return; } for(int i=0;i<n;i++){ string t; for(int j=0;j<s[i].size()-1;j++){ t=t+s[i][j]; pos=ss.rfind(t); if(pos+j+1==ss.length()&&pos!=0&&pos!=string::npos&&cnt[i]<2){ cnt[i]++; dfs(ss+s[i].substr(j+1)); cnt[i]--; } } } } int main(){ cin>>n; for(int i=0;i<n;i++) cin>>s[i]; cin>>s[n]; dfs(s[n]); cout<<ans<<endl; return 0; }