题目描述:
输入样例:
5
at
touch
cheat
choose
tact
a
输出样例:
23
AC代码:
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 21;
int n;
string word[N];//存放单词
int g[N][N];//记录每两个单词之间是否有边
int used[N];//记录每个单词被使用的次数
int ans;//存放答案
//str存放的是成语接龙
void dfs(string str, int last) {
ans = max(ans, (int)str.size());
used[last]++;
for (int i = 0; i < n; i++) {
if (g[last][i] && used[i] < 2) {
dfs(str + 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);
}
cout << ans << endl;
system("pause");
return 0;
}