kmp & Border 相关
写在前面
一直想写一个 Border 相关的文章。
网上 kmp 相关的文章都好唐啊,全是半懂不懂的人在随机说话。符号系统混乱,逻辑错误百出,还没有任何深刻的理解。
忍不了一点。
感觉越基础的算法越难自学,因为网络上基础算法的 blog 质量都比较差。高水平选手不屑于写这些基础算法的 blog,而低水平选手写出来的 blog 往往质量很差。
记号 & 约定
的长度为 为 的第 个字符 为由 的第 个字符到第 个字符组成的字串。 称为 的长为 的前缀,简写为 。 在意义明确的情况下,可简写为 称为 的长为 的后缀,简写为 或
定义和简单性质
对于字符串
记
一个重要的性质:
的 还是 。
取
记
由于
同理,
综上,
预处理
考虑如何求出
不妨设
则对
注意到,我们把现在把求
对于每一个前缀,如果我们都知道她的
考虑增量构建。显然
设已知
那么相较于
那么一个 trivial 的实现方法就是暴力遍历
同时,按照每次取出
复杂度分析
考虑一个势能函数
匹配上合法的一个
不能够匹配合法的
显然在全过程中
又因为每次操作都为
代码实现
1 | inline std::vector<int> get_pi(const std::string &s) { |
* 的结构
前文提到,
的 还是 。
这样的性质使得
具体地,连边
这启示我们和
- Title: kmp & Border 相关
- Author: rainbow-auto
- Created at : 2025-05-03 19:34:06
- Updated at : 2025-06-28 21:56:50
- Link: https://rainbow-auto.github.io/2025/05/03/Border-相关/
- License: This work is licensed under CC BY-NC-SA 4.0.