zoukankan      html  css  js  c++  java
  • kmp模板

    //这个模板主串和模式串下标都是从0开始的
    //next数组下标是从1开始的
    char S[maxn],T[maxn];
    int _next[maxn];
    int slen,tlen;
    //求模式串的next数组
    void GetNext(){
        int j=0,k=-1;
        _next[0]=-1;
        while(j<tlen){
            if(k==-1||T[k]==T[j]){
                _next[++j]=++k;
            }else {
                k=_next[k];
            }
        }
    }
    //求模式串在主串中第一次出现的下标,如果没出现返回-1
    int Kmp_Index(){
        GetNext();
        int i=0,j=0;
        while(i<slen&&j<tlen){
            if(j==-1||S[i]==T[j]){
                ++i;
                ++j;
            }
            else j=_next[j];
        }
        if(j==tlen) return i-tlen;
        else return -1;
    }
    //返回模式串在主串中出现的次数
    int Kmp_Count(){
        int ans=0,i=0,j=0;
        if(slen==1&&tlen==1){
            if(S[i]==T[j]) return 1;
            else return 0;
        }
        /*找T串在S串中出现的次数,那么这个for循环就是循环的S串,
        然后对于每一个S的下标,如果T的j位置和它不匹配,
        那么就用一个while循环一直next下去好了,然后如果相等就加一,
        如果j=tlen,就让ans++,然后j=next[j],找下个位置是不是和next[j]位置匹配*/
        for(i=0;i<slen;i++){
            while(j>0&&S[i]!=T[j]){
                j=_next[j];
            }
            if(j==-1||S[i]==T[j]) ++j;
            if(j==tlen){
                ++ans;
                j=_next[j];
            }
        }
        return ans;
    }
    

      


    char S[maxn],T[maxn]; int _next[maxn]; void GetNext(){ int j=0,k=-1; _next[0]=-1; while(j<tlen){ if(k==-1||_next[k]==_next[j]){ _next[++j]=++k; }else { k=_next[k]; } } } int Kmp_Index(){ GetNext(); int i=0,j=0; while(i<slen&&j<tlen){ if(j==-1||S[i]==T[j]){ ++i; ++j; } else j=_next[j]; } if(j==tlen) return i-tlen; else return -1; } int Kmp_Count(){ int ans=0,i=0,j=0; if(slen==1&&tlen==1){ if(S[i]==T[j]) return 1; else return 0; } for(i=0;i<slen;i++){ while(j>0&&S[i]!=T[j]){ j=_next[j]; } if(j==-1||S[i]==T[j]) ++j; if(j==tlen){ ++ans; j=_next[j]; } } return ans; }

      

  • 相关阅读:
    安装 Visual Studio 出现网络问题,无法连接
    开机时如何默认关闭小键盘
    nginx 443端口配置
    nginx启动提示 nginx: [emerg] the INET6 sockets are not supported on this platfor
    ffmpeg 常用命令
    linux下安装python3.7.2
    Win10的Hyper-V虚拟机上安装Ubuntu后显示分辨率问题
    Hyper-V安装CentOS修改分辨率
    Linux 设置简单密码
    nginx 80端口跳转到443
  • 原文地址:https://www.cnblogs.com/imzscilovecode/p/7954628.html
Copyright © 2011-2022 走看看