KMP模板

抄袭的kuangbin

/*

next[]的含义是 x[i-next[i]……i-1]=next[0……next[i]-1]

next[i]满足x[i-z……i-1]=x[0……z-1]的最大z值(就是x的自身匹配)

*/

void kmp_pre(char x[],int m,int next[])

{

    int i,j;

    j=next[0]=-1;

    i=0;

    while(i<m)

    {

        while(-1!=j&&x[i]!=x[j])j=next[j];

        next[++i]=++j;

    }

}

/*

kmpnext[]的意思是,next'[i]=next[next[……[next[i]]]](直到next'[i]<0或者x[next'[i]]!=x[i])

这种预处理,速度快一点

*/

void preKmp(char x[],int m,int kmpNext)

{

    int i,j;

    j=kmpNext[0]=-1;

    i=0;

    while(i<m)

    {

        while(-1!=j&&x[i]!=x[j])j=kmpNext[j];

        if(x[++i]==x[++j])kmpNext[i]=kmpNext[j];

        else kmpNext[i]=j;

    }

}

/*

返回x在y中出现的次数,可以重叠

*/

int next[maxn];

int Kmp_count(char x[],int m,char y[],int n)

{

    //x是模式串,y是主串

    int i,j;

    int ans=0;

    //preKmp(x,m,next);

    kmp_pre(x,m,next);

    i=j=0;

    while(i<n)

    {

        while(-1!=j&&y[i]!=x[j])j=next[j];

        i++;j++;

        if(j>=m)

        {

            ans++;

            j=next[j];

        }

    }

    return ans;

}

 

你可能感兴趣的:(KMP)