题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入输出格式
输入格式:
输入的第一行为一个单独的整数n (n≤20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式:
只需输出以此字母开头的最长的“龙”的长度
输入输出样例
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 25; 4 string S[N],tmp; 5 int ans,n,vis[N]; 6 char Head[N]; 7 int check(string u,string v){ 8 int len = min( u.size()-1 , v.size()-1 ); 9 int L1 = u.length(); 10 int L2 = v.length(); 11 for(int i=1;i<=len;i++){ 12 string tu = u.substr( L1 - i ); 13 string tv = v.substr( 0 , i ); 14 if( tu == tv ){ 15 return i; 16 } 17 } 18 return -1; 19 } 20 void dfs(string x){ 21 for(int i=1;i<=n;i++){ 22 int F = check(x,S[i]); 23 if( vis[i] <2 && F != -1 ){ 24 vis[i]++; 25 tmp = S[i].substr(F); 26 tmp = x + tmp; 27 dfs(tmp); 28 vis[i]--; 29 } 30 } 31 ans = max(ans, (int)x.length() ); 32 return ; 33 } 34 int main() 35 { 36 ios_base :: sync_with_stdio(0); 37 cin.tie(NULL),cout.tie(NULL); 38 cin>>n; 39 for(int i=1;i<=n;i++){ 40 cin>>S[i]; 41 } 42 cin>>Head; 43 for(int i=1;i<=n;i++){ 44 if( Head[0] == S[i][0]){ 45 vis[i]++; 46 dfs(S[i]); 47 vis[i]--; 48 } 49 } 50 cout<<ans<<endl; 51 }