KMP&拓展KMP

Posted alessandro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP&拓展KMP相关的知识,希望对你有一定的参考价值。

KMP算法

解析

KMP算法是一种比较高效的字符串匹配算法,可以在线性时间内找出匹配位置和匹配长度。
详解KMP

板子

(next)数组存在的意义:
(A) 串匹配到 (i)(B) 串匹配到 (j)时, 如果发现失配,可以直接令 (j = next[i]) 然后继续匹配, ( (next[i]) 将记录如果 (B) 串匹配到 (A)(i) 位置,前面有多少是已经匹配了的。)

(next) 数组的求法

inline void calc_next() {
    next[1] = 0;
    for (int i = 2, j = 0; i <= n; ++ i) {
        while (j > 0 && a[i] != a[j + 1]) j = next[j];
        if (a[i] == a[j + 1]) j ++;
        next[i] = j;
    }
}

我们用(f)数组记录每个位置能匹配的个数,基于 (next) 数组,我们能在 (O(n + m)) 的时间处理结果

inline void calc_f() {
    for (int i = 1, j = 0; i <= m; ++ i) {
        while (j > 0 && (j == n || b[i] != a[j + 1])) j = next[j];
        if (b[i] == a[j + 1]) j ++;
        f[i] = j;
        if (f[i] == n) {/* the first time */}
    }
}

拓展KMP算法

以上是关于KMP&拓展KMP的主要内容,如果未能解决你的问题,请参考以下文章

KMP算法及拓展KMP算法

hdu 4300 拓展kmp

Seek the Name, Seek the Fame POJ - 2752(拓展kmp)

拓展KMP算法详解

poj 2752(拓展KMP模板题)

Simpsons’ Hidden Talents HDU - 2594(拓展kmp)