EX-KMP,和 Manacher 回顾

给定两个字符串
,你要求出:
的 函数数组 ,即 与 的每一个后缀的 LCP(最长公共前缀)长度。
在国外,这个 EX-KMP 算法叫做「Z 函数」,可见和 KMP 关系并不大。而求这个函数的值的算法过程倒是和 Manacher 有点像。
首先回顾一下 Manacher 算法:
Manacher 算法
给出一个只由小写英文字符
组成的字符串 ,求 中最长回文串的长度 。字符串长度为 。 。
我们首先将原本的字符两两之间和首尾都插入同一种奇怪的字符,这样就可以使回文中心不再局限于字符之上,而是也可以包含两个字符中间的地方,也就是回文串长度为偶数也可以算出来。
我们定义数组
我们开始遍历这个数组。我们维护一个目前的能包含
注意:Manacher 这个算法的精髓就是利用了回文串有对称中心并且左右对称的性质。这个性质可以将现在要算的
例子如下图:
如果
而如果以
良好地利用了回文串的性质,使得 Manacher 算法的时间复杂度只有
1 | void solve(){ |
EX-KMP 算法
而 EX-KMP 算法其实和 Manacher 算法思想类似,EX-KMP 算法是维护了一个「小盒子」
我们利用这个
所以当 while
暴力往右搜索可不可以继续匹配,如果可以的话
1 | // 此处字符串为 t,长度为 m。 |
- Title: EX-KMP,和 Manacher 回顾
- Author: 11490DX
- Created at : 2025-01-04 00:07:45
- Updated at : 2025-02-14 13:05:16
- Link: https://11490dx.net/2025/01/04/ex-kmp/
- License: This work is licensed under CC BY-NC-SA 4.0.