RT
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#define maxn 30
using namespace std;
int y[maxn][maxn];
int visit[maxn];
int a[maxn];
int n;
int ans = 0;
int ma = 0;
void work(int a, int b, string s1, string s2) {
cout << s1 << ' ' << s2 << endl;
int len1 = s1.length();
int len2 = s2.length();
int ma1 = 0;
if (s1.find(s2) != string::npos) {
y[a][b] = 0;
return;
}
for (int i = 0; i < len2; i++) {
string temp;
for (int j = 0; j <= i; j++) {
temp += s2[j];
}
// int index = s1.find(temp);
// cout << index << endl;
// cout << s1.find(temp) << endl;
// cout << len1 - s1.find(temp) << endl;
if (s1.find_last_of(temp) != string::npos && (len1 - s1.find_last_of(temp) == temp.length())) { //在后缀
ma1 = temp.length();
cout << "temp=" << temp << " string=" << s1 << ' ' << len1 - s1.find(temp) << endl;
// cout << "ok" << ' ';
}
}
// cout << endl;
y[a][b] = ma1;
cout << "ma=" << ma1 << endl;
return;
}
void dfs(int x) {
bool ifOk = false;
for (int i = 0; i < n; i++) {
if (visit[i] > 2) {
continue;
}
if (y[x][i] == 0) {
continue;
}
ans += a[x];
ans -= y[x][i];
ifOk = true;
visit[i]++;
dfs(i);
ans -= a[x];
ans += y[x][i];
visit[i]--;
}
if (!ifOk) {
ma = max(ans, ma);
}
return;
}
string s_list[maxn];
string temp;
char ch;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s_list[i];
a[i] = s_list[i].length();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
work(i, j, s_list[i], s_list[j]);
}
}
for (int i = 0; i < n; i++) {
if (s_list[i][0] == ch) {
visit[i]++;
ans = a[i];
dfs(i);
visit[i] = 0;
}
}
cout << ma;
return 0;
}