#include<iostream>
#include<math.h>
using namespace std;
int ans = -1, n, maxn = -1, p = -1;
struct node {
int time=0;//被访问次数
string word;
}; node words[21];
int find(node x, node y) {
for (int i = x.word.size() - 1; i >= 0; i--) {
if (x.word[i] == y.word[0]) {
int k = 0;
for (int j = i + 1; j <= x.word.size() - 1; j++) {
k++;
if (k >= y.word.size()) {
return 0;
}
if (x.word[j] != y.word[k]) {
return 0;
}
}
return y.word.size() - (k + 1);
}
}
return 0;
}
void dfs(node a) {
for (int i = 1; i <= n; i++) {
if (a.time < 2) {
if (words[i].word != a.word) {
if (find(a, words[i])) {
a.time++;
ans += find(a, words[i]);
dfs(words[i]);
a.time--;
ans -= find(a, words[i]);
}
}
}
}
p = max(p, ans);
}
int main() {
char head;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> words[i].word;
}
cin >> head;
for (int i = 1; i <= n; i++) {
if (words[i].word[0] == head) {//扫一遍有没有符合题意的
ans += words[i].word.size();
words[i].time++;
dfs(words[i]);
words[i].time--;
maxn = max(p, maxn);
}
}
cout << maxn;
return 0;
}
//每个点最多访问两次
//从head开始,逐次访问并记录每个点访问次数,最后记录长度,与最长长度比较
//枚举两个单词能不能拼在一起,并且拼在一起的长度最短(暴力枚举)
按照这篇题解的思路写的,就是找不到问题在哪,Visual Studio提示是爆栈了
0x00007FFCEFF2CFF5 (ntdll.dll) (p1019.exe 中)处有未经处理的异常: 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000660F403FF8)。