我觉得读懂题吧。。。这个题用string真的方便,做了三个小时,给自己当个教训吧。
#include <bits/stdc++.h>
using namespace std;
const int maxn=30;
int vis[maxn];
int n,LEN,flag;
string str[maxn];
int isxunhuan(string temp)
{
int len1=temp.length();
int i,j,k;
string temp1,temp2;
for(i=1;i<=len1/2;i++){//每次取得长度
temp1=temp.substr(0,i);
int flag=1;
if(0==len1%i){
for(j=2;j<=len1/i;j++){
temp2=temp.substr((j-1)*i,i);
if(temp2!=temp1){
flag=0;
break;
}
}
if(1==flag) return i;//返回的是循环的长度
}
}
return -1;
}
int isok(string str1,string str2)
{
if(str1==str2){
int l=isxunhuan(str1);
if(-1!=l){
flag=1;
return l;
}
}
int len1=str1.length(),len2=str2.length();
string temp;
int i,j,k,t;
if(str1==str2) len2=len1-1;
if(len2>len1){
if(1==len1) t=len1;//处理的是第一次输入头节点的情况
else t=len1-1;
}
else t=len2-1;
for(i=1;i<=t;i++){
temp=str2.substr(0,i);
if(str1.rfind(temp)==len1-i){
return i;
}
}
return -1;
}
void dfs(int length,int cnt)//cnt表示的是上一个字符串的序号
{
LEN=max(length,LEN);
int i,j,k,len;
for(i=1;i<=n;i++){
if(vis[i]!=2){
int diff=isok(str[cnt],str[i]);
if(-1!=diff){
flag=1;
vis[i]++;
len=str[i].length();
dfs(length+len-diff,i);
vis[i]--;
}
}
}
}
int main()
{
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
cin>>str[i];
cin>>str[0];
dfs(1,0);
if(0==flag) LEN=0;
printf("%d",LEN);
return 0;
}