1.kmp解法
算法及流程请参考matrix67博文:http://www.matrix67.com/blog/tagscloud
时间关系先附代码,不解释
2.后缀数组(字符串处理的有力工具)
算法请参考byvoid的博文:http://www.byvoid.com/blog/lcs-suffix-array/
代码编辑中……
算法及流程请参考matrix67博文:http://www.matrix67.com/blog/tagscloud
时间关系先附代码,不解释
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
#define N 110
int next[N]= {-1};
string M[N],RM[N];
//M[p].substr(s,e-s+1)为模式串
//M[i],i<>p为主串
bool kmp(string *M,int p,int k,int s,int e)
{
//!!!计算next[i+1]
next[s]=s-1;
int i,j;
for(i=s,j=s-1; i<e;)
{
if(M[k][i+1]==M[k][j+1])next[++i]=++j;
else
{
if(j!=s-1)j=next[j];
else next[++i]=s-1;
}
}
//!!!匹配
for(i=-1,j=s-1; i!=M[p].size()-1&&j!=e;)
{
if(M[p][i+1]==M[k][j+1])i++,j++;
else
{
if(j!=s-1)j=next[j];
else i++;
}
}
//!!!匹配成功!!!
return j==e;
}
int n;
int p;
int getAns()
{
int len=M[p].size();
for(int i=len; i>0; i--)
{
for(int j=0; j+i-1<len; j++)
{
int k;
for(k=0; k<n; k++)
{
if(k!=p)
{
if( !( kmp(M,k,p,j,i+j-1) || kmp(RM,k,p,j,i+j-1) ) )break;
}
}
if(k==n)return i;
}
}
return 0;
}
int main()
{
// freopen("data.in","r",stdin);
int t;
cin>>t;
while(t--)
{
cin>>n;
p=0;
for(int i=0; i<n; i++)
{
cin>>M[i];
RM[i]=M[i];
reverse(RM[i].begin(),RM[i].end());
if(M[p].size()>M[i].size())p=i;
}
int ans=getAns();
reverse(M[p].begin(),M[p].end());
ans=max(ans,getAns());
cout<<ans<<endl;
}
return 0;
}
2.后缀数组(字符串处理的有力工具)
算法请参考byvoid的博文:http://www.byvoid.com/blog/lcs-suffix-array/
代码编辑中……