1.题目
题目链接:点击这里
2.解决思路
可以先将所有可能的“衔接”(即接龙)情况枚举出来;对于每一对字符串(A,B)单词A的后缀与单词B的前缀相同,并找到最长的相同情况,记为g[a][b]=length。注意不能将整个A用来接龙。然后对于某个字母开头的字符串使用DFS,找到它能够接龙的最大值。
3.代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=21;
string words[MAXN];
int g[MAXN][MAXN];
int n,used[MAXN],ans;
char start;
void dfs(string state,int t)
{
ans=max(ans,(int)state.size());
used[t]++;
for(int i=1;i<=n;i++){
if(g[t][i]&&used[i]<2)
dfs(state+words[i].substr(g[t][i]),i);//接龙
}
used[t]--;
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>words[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
string a=words[i],b=words[j];
for(int k=1;k<min(a.size(),b.size());k++){
if(a.substr(a.size()-k,k)==b.substr(0,k)){
g[i][j]=k;
break;
}
}
}
cin>>start;
for(int i=1;i<=n;i++){
if(words[i][0]==start)
dfs(words[i],i);
}
cout<<ans<<endl;
return 0;
}