学习心得 - 字符串 - Manacher
更好的表述:https://www.luogu.com.cn/article/acf4low9
问题
长度为
这类字符串问题,常用 Manacher 算法。
解法
字符串哈希:
SA、快速 LCA:
朴素解
考虑使用中心扩展法。
每一次确定了中间的字符,然后向左右两侧扩展枚举,求出
对于中间的字符,考虑一个指针多一,就可以求出
复杂度
改动 1
考虑在相邻字符加入 #(包括左右),左侧再加入 $,右侧 &,就可以将偶数回文串转为奇数回文串。
例子
原串 / 修改后:
a b b a
$#a#b#b#a#&
Manacher
我们定义
上面的例子就是
那么最长的就是
例如 #a#b#b#a#,回文长 abba。
同样易得,这个回文串的开头在
我们的问题,转换成了如何高速求解
Manacher 的核心思想:回文的镜像也是回文。
我们来优化朴素解:减少重复的检查。这不就是 KMP 和 AC 自动机的优化朴素解方法吗。
如图,这里显示了 Manacher 更优的原因——这样,我们在处理
但是,
像这样的问题还有几个,所以接下来介绍实现。
算法设计
动态规划。
我们设当前要求
令回文串最大右端点
-
-
- 镜像 $j(i)$ 不超过 $r$,$p_j=p_i=p_{2k-j}$。**(回文镜像原理)** - 镜像 $j(i)$ 不被 $k$ 包含,则限制失效,$p_j=w=r-j=k+p_k-j$,只能暴力扩展。
情况可以一起处理,
例题就模板,复杂度
参考资料:Manacher,算法竞赛。