思路:从第一个字符串中提取出各个子字串,用子串和他的逆序去匹配其他字符串。
PS:代码写的没有很优化,,比如可以先记录各下个字符串的长度,还有可以另写KMP逆序求NEXT数组:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int maxn = 110;
int f1[1000];
int f2[1000];
char p[110];
char t[110][110];
int N;
void getfail(char *p,int n,int f[])
{
f[0]=0;
f[1]=0;
for(int i=1;i<n;i++)
{
int j=f[i];
while(j&&p[i]!=p[j]) j=f[j];
f[i+1]= p[i]==p[j]? j+1:0;
}
}
bool KMP(char *T,char *P,int f[],int m)
{
int n=strlen(T);
int j=0;
for(int i=0;i<n;i++)
{
while(j&&P[j]!=T[i]) j=f[j];
if(P[j]==T[i]) j++;
if(j==m)
return true;
//return (i-m+1);
}
return false;
}
int main()
{
//freopen("input.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
scanf("%d",&N);
scanf("%s",p);
for(int i=0;i<N-1;i++)
scanf("%s",t[i]);
int len=strlen(p);
int ans=0;
for(int i=0;i<len;i++)
for(int l=1;l<=len-i;l++)
{
if(l<=ans) continue;
getfail(p+i,l,f1);
char rp[110];
for(int j=i+l-1,k=0;k<l;k++,j--)
rp[k]=p[j];
rp[l]='\0';
getfail(rp,l,f2);
int ok=1;
for(int w=0;w<N-1;w++)
{
if(KMP(t[w],p+i,f1,l)==false&&KMP(t[w],rp,f2,l)==false)
{
ok=0;break;
}
}
if (ok) ans=l;
}
cout<<ans<<endl;
}
return 0;
}