题目:对于字符串A1,A2,...,An ,求一个最大子串长度,使得它或者它的逆向串在每个串中出现
思路:对于A1串,寻找每一个子串,与之后n-1个串匹配。子串长度的选取可以优化。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=101;
bool kmp(string a,string b)
{
int i,j;
int fail[maxn];
j=-1;
memset(fail,-1,sizeof(fail));
for(i=1;i<a.length();i++)
{
while(j>-1 && a[j+1]!=a[i]) j=fail[j];
if(a[j+1]==a[i]) j++;
fail[i]=j;
}
j=-1;
for(i=0;i<b.length();i++)
{
while(j>-1 && a[j+1]!=b[i]) j=fail[j];
if(a[j+1]==b[i]) j++;
if(j==a.length()-1)
return 1;
}
return 0;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int N;
string a[101];
cin>>N;
for(int i=1;i<=N;i++)
cin>>a[i];
int maxlen=0;
for(int f1=0;f1<a[1].length();f1++)
{
string sub1,sub2;
int nowlen=maxlen;
bool flag=1; //flag标记当前nowlen是否可取
while(flag && f1+nowlen<a[1].length())
{
nowlen++;
sub1=a[1].substr(f1,nowlen); //返回f1开始的nowlen个字符组成的字符串
sub2=sub1;
reverse(sub2.begin(),sub2.end());
for(int i=2;i<=N;i++)
{
if(!kmp(sub1,a[i]) && !kmp(sub2,a[i]))
{
flag=0;
nowlen--;
break;
}
}
}
if(nowlen>maxlen) maxlen=nowlen;
}
cout<<maxlen<<endl;
}
return 0;
}