AcWing 1117. 单词接龙
原题链接
简单
作者:
繁花似锦
,
2020-02-20 17:37:23
,
所有人可见
,
阅读 498
预处理一段很精髓!
#include <cstring>
#include <iostream>
using namespace std;
const int N = 21;
int n;
string word[N];
int g[N][N]; // g[a][b]表示 a 与 b 能够重合的最短长度
int used[N]; // 每个单词使用的次数
int ans;
void dfs(string dragon, int last)
{
ans = max((int)dragon.size(), ans);
used[last] ++ ;
for(int i=0;i<n;i++)
if(g[last][i] && used[i] < 2)
dfs(dragon + word[i].substr(g[last][i]), i);
used[last] -- ; //恢复现场
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>word[i];
char start;
cin>>start;
// 预处理这一段很精髓!
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
string a=word[i],b=word[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;
}
}
for(int i=0;i<n;i++)
if(word[i][0]==start)
dfs(word[i],i); // dfs(单词龙,单词编号)
cout<<ans<<endl;
return 0;
}