本题与1226,3450基本一样!!!!!!!!!!!!不解释,详细可以看1226的结题报告
#include<iostream>
using namespace std;
#define max 100
int next[max];
void prekmp(char aa[])
{
int j=-1;
next[0]=-1;
int len=strlen(aa);
for(int i=1;i<len;i++)
{
while(j>=0&&aa[i]!=aa[j+1])
j=next[j];
if(aa[i]==aa[j+1])
j++;
next[i]=j;
}
}
int kmp(char ss[],char a[])
{
int len=strlen(a);
int lens=strlen(ss);
int j=-1;
for(int i=0;i<len;i++)
{
while(j>=0&&ss[j+1]!=a[i])
j=next[j];
if(ss[j+1]==a[i])
j++;
if(j==lens-1)
return 1;
}
return 0;
}
int main()
{
char a[15][max];
char ta[max],tb[max];
int t,n;
char tc[max];
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d",&n);
int temp=1;
int len=0x7FFFFFFF;
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]);
int tlen=strlen(a[i]);
if(tlen<len)//选出最小的,优化1
{
temp=i;
len=tlen;
}
}
int sign=0,sign1=0;
int i;
for( i=len;i>=1;i--)
{
for(int k=0;k<60;k++)
tc[k]='z';
tc[60]='\0';
for(int j=0;j+i-1<len;j++)
{
int cou=0;
for(int k=j;k<=j+i-1;k++)
ta[cou++]=a[temp][k];
ta[cou]='\0';
cou=0;
prekmp(ta);//这个我已开始放在kmp里了,发现很浪费时间啊,优化2
for(int k=1;k<=n;k++)
{
if(k!=temp)
{
if(kmp(ta,a[k]))
{
cou++;
}
else
break;//这个优化很重要啊 优化3
}
}
if(cou==n-2+1)
{
sign=1;
sign1=1;
if(strcmp(ta,tc)<0)
strcpy(tc,ta);
}
}
if(sign==1)
{
int tr=strlen(tc);
if(tr<3)
printf("no significant commonalities\n");
else
printf("%s\n",tc);
break;
}
}
if(sign1==0)
printf("no significant commonalities\n");
}
}
return 0;
}