ac代码转自http://blog.csdn.net/qq_35078631/article/details/63252336
逻辑缜密,思路清晰
暴力搜索解决问题
ac代码如下
#include<bits/stdc++.h> //万能的头文件
using namespace std;
int n;
string s[21],head;
vector<int>vec[21]; //vec[i]数组存放着所有与i匹配的字符串编号
int length[21][21]={0}; //length[i][j]数组里存放着字符串i和字符串j匹配的子串的长度
int ans=0;
int v[21]={0};
void get_ready(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=s[i].size()-1;k++){
string tmp1,tmp2;
tmp1.assign(s[i],s[i].size()-k,k);
if(s[j].size()<=k) break;
tmp2.assign(s[j],0,k);
if(tmp1==tmp2){
vec[i].push_back(j);
length[i][j]=k;
break;
}
}
}
}
}
void dfs(int pos,int len){
int flag=0; //用来标记是不是走到了尽头
for(int i=0;i<vec[pos].size();i++){
if(v[vec[pos][i]]<2){
v[vec[pos][i]]++;
flag=1;
dfs(vec[pos][i],len+s[vec[pos][i]].size()-length[pos][vec[pos][i]]);
v[vec[pos][i]]--;
}
}
if(flag==0){
ans=max(ans,len);
return ;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>s[i];
}
cin>>head;
get_ready();
for(int i=1;i<=n;i++){
if(head[0]==s[i][0]){
v[i]++;
dfs(i,s[i].size());
v[i]--;
}
}
cout<<ans<<endl;
return 0;
}