【学习笔记】KMP 相关算法
KMP#
单模式串匹配,比较平凡所以不说了,比较有借鉴意义的每次拓展一位和 数组能极大减少不合法的匹配,时间复杂度 。
引出一个定义,记满足 的前缀为字符串 的 ,所有的 构成 集合。
失配树#
KMP 处理 数组时是一个类似 的操作,可以看作连边,根节点是 ,一个前缀对应节点的全部祖先恰好是这个前缀的 集合。那么求两个前缀的最长公共 就是树上 ,可能需要分是否是祖先关系讨论一下。
KMP 自动机#
就是只有一个模式串版本的 AC 自动机,只要从 构建转移指针就行,目测用处不大。
Z 函数#
又叫扩展 KMP。
算法思想#
定义 Z 函数 ,即后缀和原串的 。
考虑维护当前最右端的区间 ,扩展的方法类似 Manacher:
-
若 ,直接暴力拓展;
-
若 ,那么 ,于是 ,那么 ,设为初始值再暴力拓展即可。
复杂度是线性的,证明考虑暴力拓展非 次时 必然增大。
例题#
CodeForces-432D Prefixes and suffixes *2000#
的就是 ,查询出现次数就是 的位置个数。
Periodicity Lemma#
定义 是 的一个周期当且仅当对于 ,有 。感性理解就是周期就是一个字符串划分成若干相等的段,最后一段可以是这些段的一个前缀。
Weak Periodicity Lemma:若 都是字符串 的周期且 ,则 也是 的周期。
直观来看 导出 是类似辗转相除的跳来跳去,存在一个问题:如果将字符串按照两个周期分别补充成无限长,得到的结果可能不相等,例如 如果按 和 补充肯定是不相等的,那么跳来跳去就可能出错,所以有一个长度的限制。
弱周期引理的证明比较简单,考虑归纳,规定 ,假设已经证明对于任意 都是成立的,而 时显然也成立。由于 且 ,可以将 划分成 和 两部分。对于前者, 与 都在 范围内,于是 ;对于后者,实际考虑 , 与 都在范围内,于是 , 就是 的一个周期,而根据归纳 也是 的一个周期。
Periodicity Lemma:若 都是字符串 的周期且 ,则 也是 的周期。
有一个生成函数证明,感觉很有趣。记 分别为长度为 的周期, 分别为按照周期补充的无限长串,那么满足:
于是可以得到:
把后面的东西记作 ,观察可知 ,而 ,所以 ,根据其度数知 ,所以 ,不需要截取,所以后面就能按照辗转相除证明了。
Border Series#
内容#
主要是证明一个性质:一个字符串 的 可以划分为 个等差数列。
首先考虑任意一个 ,发现 有长为 的周期,这个画一画图就容易得到。
那么取出所有长度 的 ,其中最长的一个就对应了 的最小周期 ,发现取任意 的倍数也能得到一个周期,现在需要证明这些周期中不含不是 的倍数且夹在两个倍数之间的。考虑另一个周期 ,若 ,即满足 Weak Periodicity Lemma,那么一定有 ,否则 ,那么 就不是最小周期了。这里取出的长度为 的 对应的周期一定 ,因此二者之和一定满足 Weak Periodicity Lemma 的限制。
于是证明了所有长度 的 构成了一个公差为最小周期的等差数列,考虑找到剩下的 中最长的一个,将其作为整个串,继续这样处理,只需要 次就结束了。
之后不妨再来看看放在失配树是什么样子:就是把根到 节点链划分成 条等差数列,同时如果失配树上有分叉,那么一定是某个等差数列的首项。
例题#
Luogu-P5829 失配树#
考虑不用失配树做。
考虑当前节点 ,记 ,若 ,则再往下减少 的长度就不符合长度大于二倍的要求了,所以 就是链顶;否则取 就是链顶,每次选链顶编号大的跳上去。
Luogu-P4156 WC 2016 论战捆竹竿#
相当于每次加上除去 的部分,是同余最短路问题。
降低复杂度需要从 Border Series 入手,得到 个三元组 ,表示可以增加长度为 的字符串,其中 。
对每种等差数列依次考虑肯定是正确的,对三元组 求模 的同余最短路,转移会形成 个环,可以对这些环分别考虑。其中转移前的最小值一定不会被转移,也不会有其他转移跨过这个最小值,可以从这个位置断开,之后转移只剩 的限制,可以单调队列优化。
之后考虑如何把模 的同余最短路转成模 的同余最短路,不妨看做多源,初始值 ,同样也形成了 个环,选最小值断开,此时转移没有任何限制,直接前缀 优化就行了。
参考资料#
Z 函数#
周期引理#
-
课件 - Cage
Border Series#
-
APJifengc
作者:SoyTony
出处:https://www.cnblogs.com/SoyTony/p/17955245/Learning_Notes_about_KMP_Related_Algorithms
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效