码迷,mamicode.com
首页 > 其他好文 > 详细

KMP模板

时间:2015-02-20 10:50:40      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

抄袭的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模板

标签:

原文地址:http://www.cnblogs.com/qscqesze/p/4296434.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!