思路:要找到所有的串的最大公共串,一定存在于最小的串中所以先找到最小的串,然后再找出这最小长度的
母串的子串所能组成的序列,然后不停的和其他串像比较找到最长子串就可以.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<math.h>
#include<algorithm>
#define ll __int64
#define inf 0x3f3f3f3f
using namespace std;
string arr[110];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m,i,k,j,l,bj;
int cla;
scanf("%d",&cla);
while(cla--)
{
l=200;
scanf("%d",&n);
getchar();
for(i=0; i<n; i++)
{
cin>>arr[i];
if(arr[i].size()<l)
{
bj=i;
l=arr[i].size();
}
}
int ans=0;
for(i=arr[bj].size(); i>0; --i)
for(j=0; j<=arr[bj].size()-i; ++j)
{
string x,y;
x=arr[bj].substr(j,i);//substr是取从第j位到i位(从0~i-1内的串)
y=x;
reverse(y.begin(),y.end());
for(k=0; k<n; ++k)
{
if(k==bj)continue;
if(arr[k].find(x)==-1&&arr[k].find(y)==-1)
break;
}
if(k==n)
ans=max(ans,max(x.size(),y.size() ) );
}
cout<<ans<<endl;
}
return 0;
}