Manacher算法理解

插入特殊符号#和&的预处理过程不解释,只解释最核心的内容。

正文:

P[i] 表示(经过预处理之后)字符串 S' 中第 i 个字符的回文子串长度,因此 max(P[i]-1) 即为原字符串 S 中最长回文子串的长度(容易验算,不解释)


id :当前最长回文子串中心位置

mx :当前最长回文子串的右边界位置


结论:如果 mx>i ,那么 P[i]\geq min(P[2*id-i], mx-i)


看不懂没关系,我先翻译成人话: 如果i点包含在当前最长回文子串之中(肯定要包含,不然求个鬼),那么i点的回文子串长度为下列两种情况的最小值:

1、i 关于中心 id 对称的点 j 的已知子串长度(左边对称点 j=2id-i 的最长回文子串长度已知)


2、 右边界到 i 点的距离(无论超过边界还是正好处于边界,都取最小值 mx-i

如果你能看懂上面说的是什么,那么你就大体了解了Manacher算法

现在开始分析:

1、 因为 ij 是关于 id 的对称点,而 id 子串(以 id 为中心的最长回文子串,下同

)肯定是左右对称且包含了 i 子串(前提),那么 i 子串必定与 j 子串对称,所以可以直接继承已经计算过的 j 的最长子串长度 P[j] ,即 P[i]=P[j]=P[2id-i]

2、 在这种情况下, i 子串并不完全包含在 id 子串中,但是容易看出的是, i子串至少会有 mx-i 的长度(正好达到边界),即 P[i]\geq mx-i

因此 i 子串的长度取这两种情况的最小值 min ,即:

P[i]\geq min(P[2*id-i], mx-i)

证毕#


补充说明一下: i 子串的长度如果超过边界 mx ,那么先取最小值 mx-i ,再接下去匹配过程中会继续判断超过 mx 的部分是否对称

猜你喜欢

转载自blog.csdn.net/qq_28038873/article/details/80363553