题意:就是找几组字符串相同的字符串,小于三个相同就不输出。
思路:枚举第一个字符串的每个子字符串,然后去和其他字符串相比较。
使用KMP,方法比较暴力。
#include<string.h>
#include<stdio.h>
char str[11][61],ss[101],sss[101];
int next[101],maxn=0,cnt=0,len;
int panduan(int k)
{
int j=-1,i=0;
next[0]=-1;
while(i<cnt)
{
if(j==-1||ss[i]==ss[j])
next[++i]=++j;
else
j=next[j];
}
i=0,j=0;
int ans=0;
while(i<len)
{
if(ss[j]==str[k][i])
{
if(j==cnt-1)
{
ans++;
j=next[j];
}
else
{
i++;
j++;
}
}
else
{
if(j==-1)
{
i++;
j++;
}
else
j=next[j];
}
if(ans==1)
return 1;
}
if(ans)
return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%s",str[i]);
len=strlen(str[0]);
maxn=0;
for(int i=0; i<strlen(str[0]); i++)
{
for(int j=0; j<strlen(str[0]); j++)
{
if(j-i<2)
continue;
cnt=0;
for(int k=i; k<=j; k++)
ss[cnt++]=str[0][k];
ss[cnt]='\0';
int f=0;
for(int k=1; k<n; k++)
{
int t=panduan(k);
if(!t)
{
f=1;
break;
}
}
if(f==0)
{
if(maxn<=cnt){
strcpy(sss,ss);maxn=cnt;}
}
}
}
if(maxn>1)
printf("%s\n",sss);
else
puts("no significant commonalities");
}
return 0;
}