深度优先搜索,回溯
#include<iostream>
#include<string>
using namespace std;
int n,b[21],num,sum;//b是判重用的,num是最终输出的最长串,sum是目前串长度
string a[21]; //
char c; //头
int dfs(char x,string s)//上一串的尾字符和上一个单词
{
if(sum>num)
num=sum;
for(int i=1;i<=n;i++)
{
for(int j=0;j<a[i].size();j++)
{
if(a[i][j]==x) //如果该串中可能有与上串重合部分
{
int flag=0; //判定
int ii=s.size(); //见下文s[--ii]
for(int k=j;k>=0;k--)
{
if(a[i][k]!=s[--ii])
flag=1; //如果不匹配则flag=1
}
if(!flag&&b[i]<2) //如果尾字符前部分完全匹配
{
sum+=a[i].size()-j-1;//
b[i]++; //同main函数中的搜索
dfs(a[i][a[i].size()-1],a[i]);
sum-=a[i].size()-j-1;
b[i]--;
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cin>>c; //头
for(int i=1;i<=n;i++)
{
if(a[i][0]==c)
{
b[i]++;
sum+=a[i].size();
dfs(a[i][a[i].size()-1],a[i]);
sum-=a[i].size();//回溯
b[i]--; //回溯
}
}
cout<<num;
}