• 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;
    }
  • 相关阅读:
    flex产生水平滚动条
    js中的类
    typescript
    vue练习
    vue-cli2脚手架搭建
    Luogu P1970 花匠
    Luogu P1311 选择客栈
    Luogu P1016 旅行家的预算
    Luogu P1144 最短路计数
    Luogu P1091 合唱队形
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4296434.html
Copyright © 2020-2023  润新知