题目:POJ - 3080
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<set>
using namespace std;
#define LL long long
#define maxn 400005
int F[65];
void get_F(char B[])
{
memset(F,0,sizeof(F));
F[0]=-1;
int lb=strlen(B);
for(int i=0;i<lb;i++)
{
int j=F[i];
while(j!=-1&&B[i]!=B[j])
j=F[j];
F[i+1]=j+1;
}
return ;
}
int kmp(char A[],char B[])
{
int la=strlen(A);
int lb=strlen(B);
int j=0,i=0;
while(i!=la)
{
if(A[i]==B[j]||j==-1)
{
i++;
j++;
}
else
j=F[j];
if(j==lb)
return 1;
}
if(j==lb)
return 1;
return 0;
}
char s[15][65];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",s[i]);
char ans[65]={'Z'};
int Flag=0;
for(int i=60;i>=3;i--)
{
for(int j=0;j<=60-i;j++)
{
char ne[65];
strncpy(ne,s[0]+j,i);
ne[i]='\0';
get_F(ne);
int flag=0;
for(int z=1;z<n;z++)
{
if(!kmp(s[z],ne))
{
flag=1;
// printf("1==%s %d\n",s[z],z);
// printf("2==%s\n",ne);
break;
}
}
if(flag==0)
{
if(strcmp(ans,ne)>0)
strcpy(ans,ne);
}
}
if(ans[0]!='Z')
{
Flag=1;
break;
}
}
if(Flag==1)
printf("%s\n",ans);
else
printf("no significant commonalities\n");
}
return 0;
}