没啥可说的。。。就去dfs就好了。。
upd:最新版看这里:传送门
#include<cstdio>
#include<cstring>
int n,a[21],ans=0,sum=0;
char s[21][21],ss[1];
int cmp(int i,int k){
int x=0;
if(a[i]>=2) return x;
for(int j=1;s[k][j]!=0;j++){
if(s[i][0]==s[k][j]){
int xx=strlen(s[k])-j;
if(xx>=strlen(s[i])) xx=0;
else{
for(int ii=1;ii<xx;ii++){
if(s[k][j+ii]!=s[i][ii]) xx=0;
}
}
if(xx!=0) x=xx;
}
}
return x;
}
void dfs(int k){
for(int i=1;i<=n;i++){
int x=cmp(i,k);
if(x!=0){
sum=sum+strlen(s[i])-x;
a[i]++;
if(sum>ans) ans=sum;
dfs(i);
sum=sum-strlen(s[i])+x;
a[i]--;
}
}
}
int main(){
//freopen("a.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",&s[i]);
a[i]=0;
}
scanf("%s",ss);
for(int i=1;i<=n;i++){
if(s[i][0]==ss[0]){
sum+=strlen(s[i]);
if(sum>ans) ans=sum;
a[i]++;
dfs(i);
sum-=strlen(s[i]);
a[i]--;
}
}
printf("%d",ans);
return 0;
}