这个算法主要靠画图理解,于是学习的时候画了不少图,正好写篇博客。 扩展KMP能解决的问题: 给定两个串$S,T$,对于S的每一个后缀$S[i...n]$求和$T$的$LCP$。 设$exnxt_i$表示后缀$S[i...n]$求和$T$的$LCP$,我们要做的就是求所有$exnxt_i$。 我们先对 ...
分类:
其他好文 时间:
2019-12-20 18:58:27
阅读次数:
89
后缀自动机 (suffix automaton, SAM) 是一个能解决许多字符串相关问题的有力的数据结构。(否则我们也不会用它) 举几个例子,以下的字符串问题都可以在线性时间内通过 SAM 解决 1.在另一个字符串中搜索一个字符串的所有出现位置。(诶?KMP好像能做) 2.计算给定的字符串中有多少 ...
分类:
其他好文 时间:
2019-12-17 20:35:36
阅读次数:
102
```c#include #include #include #include //以下为KMP算法void get_next(char * T, int next[]) //修正前的next数组{ int i = 1, j = 0; next[0] = -1; next[1] = 0; int m... ...
分类:
编程语言 时间:
2019-12-14 14:00:25
阅读次数:
115
温馨提示:倘若下角标看不清的话您可以尝试放大。 倘若没有通配符的话可以用KMP搞一搞。 听巨佬说通配符可以用FFT搞一搞。 我们先考虑一下没有通配符的怎么搞。我们设a=1,b=2,...,然后我们构造一个这样的函数$\displaystyle P_x=\sum_{i=0}^{m 1}(A_i B_{ ...
分类:
其他好文 时间:
2019-12-11 09:35:35
阅读次数:
88
有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍。但KMP算法真的不适合这样去学。最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉。我试着从这个思路再介绍一下。大家只需要记住一点,PMT是什么东西。然后自己临时推这个算法也是能推出来的, ...
分类:
编程语言 时间:
2019-12-10 22:48:52
阅读次数:
178
字符串神题。 要点:Lyndon分解,扩展KMP, 最小循环表示,贪心。 题目链接 题意 已知字符串 $S$, 请你把它切成不超过 $k$ 段,并翻转其中若干段,使得最终字符串的字典序最小。 题解 先想一想如果 $k=|S|$ 怎么做。此时我们发现可以去掉“是否翻转”的决策,因为如果有一段不翻转,我 ...
分类:
其他好文 时间:
2019-12-07 18:05:26
阅读次数:
537
1.啥是KMP算法? KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一 ...
分类:
编程语言 时间:
2019-12-07 14:45:32
阅读次数:
90
[TOC] kmp 问题:有两个字符串,S为主串(长度为n),T为模式串(长度为m),其中n m,如何判断T是否为S的子串 样例: abbaabbaaba abbaaba 朴素解法: S从头开始遍历,以每个字母为开头,再遍历T看是否匹配。 如何降低时间复杂度? 第一次匹配时,到了第七个字符发现不匹配 ...
分类:
其他好文 时间:
2019-12-01 20:52:27
阅读次数:
109
概念明确:被匹配串、匹配串。如从cbabce找ab,前者和后者分别称为被匹配串、匹配串。 最容易想到的方法:从首字母开始,逐个比较下去。一旦发现有不同的字符就停止并将这个匹配串后移一位,然后从头开始进行下一次比较。这样,就需要将字串中的所有字符一一比较。 KMP算法 Boyer-Moore算法 基于 ...
分类:
编程语言 时间:
2019-11-26 13:35:29
阅读次数:
76