zoukankan      html  css  js  c++  java
  • 拓展KMP以及模板

    废话不多说,上模板

    #include<bits/stdc++.h>
    const int maxn = 1e6 + 10;
    int Next[maxn], extend[maxn], moL, strL;///Next数组、extend数组、模式串长度、母串长度
    char mo[maxn], S[maxn];///模式串、母串
    void GetNext()///求解模式串 mo 的 Next 数组
    {
        Next[0] = moL;
        int a, p;
        for (int i = 1, j = -1; i < moL; i++, j--){
            if (j < 0 || i + Next[i - a] >= p){
                if (j < 0) p = i, j = 0;
    
                while (p < moL && mo[p] == mo[j]) p++, j++;
    
                Next[i] = j;
                a = i;
            } else Next[i] = Next[i - a];
        }
    }
    
    void GetExtend()///模式串 mo 对主串 S 求解 extend 数组
    {
        GetNext();
        int a, p; ///记录匹配成功的字符的最远位置p,及起始位置a
        for (int i = 0, j = -1; i < strL; i++, j--){ ///j即等于p与i的距离,其作用是判断i是否大于p(如果j<0,则i大于p)
            if (j < 0 || i + Next[i - a] >= p){ ///i大于p(其实j最小只可以到-1,j<0的写法方便读者理解程序)
                if (j < 0) p = i, j = 0; ///如果i大于p
    
                while (p < strL && j < moL && S[p] ==  mo[j])
                    p++, j++;
    
                extend[i] = j;
                a = i;
            } else extend[i] = Next[i - a];
        }
    }
    Template

    本文实际就是为了记录一下较好的拓展KMP资料...........

    问题提出 : 给出子串以及母串,我们定义extend[i]表示从母串的第 i 字符开始到最后(也就是从 i 位置开始的后缀 )与子串的最长公共前缀长度,现在要求在线性时间内对于母串的所有位置求出extend值即extend[ 0~strlen(母串)-1 ]

    参考 : 在网上看了好多博客,都不能看的非常明白,直到遇到这个图文并茂的博客,强烈推荐 ==> 点我

    完了嘛?嗯,完了……

  • 相关阅读:
    MySQL 索引优化
    [转]多列索引
    abstract class和interface有什么区别? [转]
    PM knowledge
    委托应用场景[摘]
    Web 服务描述语言工具 (Wsdl.exe)[FROM msdn]
    C# 四个基本技巧[转]
    What are database states? [forward]
    学做程序经理[摘]
    SET IDENTITY_INSERT 学习心得[转]
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/7575386.html
Copyright © 2011-2022 走看看