• 扩展KMP


    有两个S,T串,扩展KMP求,每一个S串的后缀和T串的最长公共前缀长度。

    详细介绍:https://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html

    简单介绍一下:

    扩展KMP,通过先处理T串next数组,然后用同样的方法去处理S,T;

    具体意义:

    next[i] : T的后缀 i ,和T串本身的最长公共前缀长度。

    extend[i] : S的后缀 i ,和T串的最长公共前缀长度。

    L : 能保证匹配的最长长度,然后L很短,extend[k+1] = L;

    否则:从p后面开始匹配,更新。这样匹配extend就算完了。

    那么,前面用的next 数组怎么得来呢? 可以发现next和extend 定义极为类似,这样同样的思路,T自己匹配自己。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int MAX_N  = 101010;
    
    int next[MAX_N],extend[MAX_N];
    
    void getnext(char *T) {
        int a = 0;
        int Tlen = strlen(T);
        next[0] = Tlen;
    
        while(a<Tlen-1&&T[a]==T[a+1]) a++;
        next[1] = a;
    
        a = 1;
    
        for(int k=2; k < Tlen; k++) {
            int p = a + next[a] - 1,L = next[k-a];
            if((k-1)+L>=p) {
                int j = (p-k+1) > 0 ? p - k + 1 : 0;
                while(k+j<Tlen&&T[k+j]==T[j])
                    j++;
                next[k] = j;
                a = k;
            }
            else next[k] = L;
        }
    
    }
    
    void getextend(char *S,char *T) {
        int a = 0;
        getnext(T);
    
        int Slen = strlen(S);
        int Tlen = strlen(T);
    
        int MinLen = Slen < Tlen ? Slen : Tlen;
        while(a<MinLen&&S[a]==T[a]) a++;
        extend[0] = a;
        a = 0;
    
        for(int k=1; k < Slen; k++) {
            int p = a + extend[a] - 1,L = next[k-a];
            if((k-1)+L>=p) {
                int j = (p - k + 1) > 0 ? p - k + 1:0;
                while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;
                extend[k] = j;
                a = k;
            }
            else extend[k] = L;
        }
    
    }
  • 相关阅读:
    查看zookeeper的注册信息
    troubleshooting -zk 报错解决方案
    查看状态信息
    kafka
    查看进程jps的脚本
    大数据项目.
    hadoop支持LZO压缩配置
    linux 增加行号 vim ~/.vimrc
    CDH环境搭建遇到的问题
    hadoops的版本datanode和namenode的版本
  • 原文地址:https://www.cnblogs.com/TreeDream/p/7407420.html
Copyright © 2020-2023  润新知