您的位置:首页 > 其它

poj1226(kmp算法,后缀数组)

2011-07-22 21:37 453 查看
1.kmp解法
算法及流程请参考matrix67博文:http://www.matrix67.com/blog/tagscloud
时间关系先附代码,不解释

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;

#define N 110

int next
= {-1};
string M
,RM
;
//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/
代码编辑中……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: