#include <bits/stdc++.h>
using namespace std;
string s[21];
int n, ans;
int sb[21];
int check(int y, int x) {
int minl = min(s[x].length() - 1, s[y].length() - 1);
for (int i=1;i<=minl ;i++)
{//check
bool m = true;
for (int j = 1; j <= i; j++)
{
if (s[x][s[x].length() - 1 - i + j] != s[y][j - 1]) {
m = false;
break;
}
}
if (m) return i;
}
return 0;
}
void dfs(int l, int x) {
ans = max(ans, l);
for (int i = 1; i <= n; i++)
{
if (sb[i]<2) //没用过s
{
int a = check(i, x); //有无连接部分
if (a > 0) //有的话
{
sb[i]++;
dfs(l + s[i].length() - a, i); //更新长度
sb[i]--;
}
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n+1; i++)
cin >> s[i];
memset(sb, 0, sizeof(sb));
for (int i = 1; i <= n; i++)
{
if (s[i][0] == s[n + 1][0])
{
sb[i]++;
dfs(s[i].length(), i);
sb[i]++;
}
}
cout << ans;
}
原文:https://www.cnblogs.com/asanagiyantia/p/11748083.html