kmp模板

2019-03-23  本文已影响0人  MMatx

KMP模板

const int maxn=2000000+50;
int nextt[maxn];
int a[maxn],b[maxn];
int n,m;
int kmnext[maxn];
void  Find()
{
    memset(nextt,0,sizeof(nextt));
    int i=0;
    int j=-1;
    nextt[0]=-1;
    while(i<m)
    {
        while(j!=-1&&b[i]!=b[j])
        {
            j=nextt[j];
        }
        nextt[++i]=++j;
    }
}
void EXKMP()
{
    int i=0;
    int j=-1;
    nextt[0]=-1;
    while(i<m)
    {
        if(j!=-1&&b[i]!=b[j])
            j=kmnext[j];
        if(b[++i]==b[++j])
            kmnext[i]=kmnext[j];
        else
            kmnext[i]=j;
    }
}
int  KMP()
{
    int ans=-1;
    int  j=-1;
    for(int i=0; i<n; i++)
    {
        while(j!=-1&&a[i]!=b[j])
            j=nextt[j];
        j++;
        if(j==m)
        {
            ans=i-m+2;
            break;
        }
        if(a[i]==b[j])
        {
            if(j+1==m)
            {
                ans=i-m+2;
                break;
            }
        }
    }
    return ans;
}
上一篇 下一篇

猜你喜欢

热点阅读