poj1226(kmp算法,后缀数组)

来源:互联网 发布:张龙 java 编辑:程序博客网 时间:2024/06/05 18:48
1.kmp解法
算法及流程请参考matrix67博文:http://www.matrix67.com/blog/tagscloud
时间关系先附代码,不解释

#include<iostream>#include<cstdio>#include<algorithm>#include<string>using namespace std;#define N 110int 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/
代码编辑中……
原创粉丝点击