http://codevs.cn/problem/1018/
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
string a[21];int n;
int b[21][21];
string s; //源操作字符
map<string,int>mp; //判断某个单词用了几次
int len=0; //长度
int ans=-1; //结果
void ini(){
//输入
cin>>n;
for(int i=0;i<n;++i){
cin>>a[i];
mp[a[i]]=0;
}
cin>>s;
//写满b[][]
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
string &x=a[i];
string &y=a[j];
int q=-1;
for(int k=1;k<=x.length()&&k<=y.length();k++){
if(y.substr(0,k)==x.substr(x.length()-k)){
// cout<<y.substr(0,k)<<" ";
q=k;break;
}
}
if(q==x.length()||q==y.length()){
q=-1;
}
b[i][j]=q;
}
}
}
void dfs(int index){
mp[a[index]]++;
for(int i=0;i<n;i++){
if(b[index][i]!=-1&&mp[a[i]]<2){
len+=a[i].length()-b[index][i];
ans=ans>len?ans:len;
dfs(i);
len-=a[i].length()-b[index][i];
}
}
mp[a[index]]--;
}
int main(){
ini();
for(int i=0;i<n;i++){
if(s[0]==a[i][0]){
len=a[i].length();
ans=ans>len?ans:len;//特别注意,有可能初始状态就是目的答案,需要特判一下0情况。
dfs(i);
}
}
cout<<ans<<endl;
return 0;
}