KMP 与 Z 函数拓展
【失配树:KMP 拓展】
先 KMP 一遍。然后对
则最长公共 border 就是这棵树上的 LCA 对应的长度。
border:若
周期:若
整周期:若
KMP 求出来的是
exKMP 求出来的是
记
记
【一些结论】
-
字符串
的所有 border 长度为 -
若
有长度为 的 border 以 为周期。 -
如果 border 存在,最短 border 长度
。 -
若
以 为整周期 。 -
某个真 cyclic-shift 等于 。 -
若
,则 ;否则 。 -
若
分别以 为整周期,则 以 为整周期。(弱周期定理)证明:考虑
。有 。由裴蜀定理,存在 。则 。 -
。考虑引入第三个命题:
。我们尝试证明 和 都与 等价。显然从 去推另外两个是很简单的。-
。由结论 7,
以 为周期,则 都以 的前 个字符作为周期。 -
。根据
的长度归纳。显然 的时候成立。然后考虑 三种情况。 显然。而 可以对称。因此只需要证明 情况。当
, 。不妨 ,则 。于是 ,由归纳法知 ,而 显然 也相等。
于是证毕。
-
-
。考虑
的情况(看作十进制数)。记 。左边可以看作两个循环小数的比较:
。右边可以写成十进制数:
。可以发现这两个式子等价。拓展到更大的字符集也可以类似做,只是进制改变了。
【题目】
-
判断两个字符串
是否循环同构。令
,判断 中是否有 即可。跑一遍 KMP。 -
题意:若
是 的真前缀,且 是 的前缀,称 是 的周期。给定字符串 ,求 每个前缀的最长周期长度之和(如果不存在算 )。注意这个周期的定义和上面不是一个。容易发现,对于一个固定的
,它最大周期等于 减去 的最短真 border 的长度(如果不存在真 border 则不存在周期)。因此跑一遍 KMP,可以求出每个前缀原始的
。这里又有两种方法。-
失配树找最高级祖先。
-
类似并查集路径压缩。因为如果当前位置的
不是这个位置最小的 ,那么任何时刻都不会用到这个位置的 。于是每到一个新位置,直接暴力把当前位置的 一直递归到最小即可。
-
-
寻找
的最长前缀是 的子串。SAM 直接冲我们可以用 KMP 这个优雅的算法。令
作为模式串, 作为母串。观察得知,KMP 当匹配到母串的第
个位置时,实际上已经算出了 作为 的后缀的最大前缀 。答案就是
. -
求
每个前缀的出现次数。SAM 直接冲-
KMP 方法。先对
做一遍 KMP。对于前缀 ,只要看 里有多少个 即可。不要忘了加上自己开头出现了一次。 -
Z 函数方法。先求出
函数。对于前缀 ,只要看 里有多少个 即可。不要忘了加上自己开头出现了一次。
-
-
简化题意:求最长回文后缀。
令
。对 求 函数,然后枚举每个后缀判断即可。 -
求本质不同子串数。
SAM 直接冲考虑增量算法:已经处理了字符串
,在前面加一个字符 ,考虑以 开头的子串们。利用 去重。不过因为每新加入一个字符就要重新求一遍,复杂度
。 -
结论:两个回文串
。 。那么弄一个类似桶的东西即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!