Manacher
前情提要 Z-Algorithm。这两个东西真得的很像。没错我大部分都是复制的。
默认字符串为
Manacher 和扩展 KMP 在原理上极为相似。Manacher 所解决的问题是,求解
显然可以通过二分+哈希在
接下来介绍这个算法的流程。
我们按照从前往后的顺序递推地求出
我们维护
此时显然有
-
 此时 $i$ 可以继承 $2k-i$ 的信息,因为它们都在 $[k-p_k+1,k+p_k-1]$ 这个回文子串中且位置对称。 - $p_{2k-i} \ge r-i+1$:从 $r-i+1$ 开始,继续暴力扩展; - 否则:$p_i = p_{2k-i}$。 -
每次暴力扩展后,
for (int r = -1, k = 0, i = 0; i < n; ++ i ) {
if (r >= p[2 * k - i] + i) {
p[i] = p[2 * k - i];
} else {
p[i] = min(r - i + 1, p[2 * k - i]);
while (i + p[i] < n && i - p[i] >= 0 && s[i - p[i]] == s[i + p[i]]) {
p[i] ++ ;
}
}
if (i + p[i] - 1 > r) {
k = i;
r = i + p[i] - 1;
}
}