#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