插入特殊符号#和&的预处理过程不解释,只解释最核心的内容。
正文:
表示(经过预处理之后)字符串 中第 个字符的回文子串长度,因此 即为原字符串 中最长回文子串的长度(容易验算,不解释)
:当前最长回文子串中心位置
:当前最长回文子串的右边界位置
结论:如果 ,那么
看不懂没关系,我先翻译成人话: 如果i点包含在当前最长回文子串之中(肯定要包含,不然求个鬼),那么i点的回文子串长度为下列两种情况的最小值:
关于中心 对称的点 的已知子串长度(左边对称点 的最长回文子串长度已知)
右边界到 点的距离(无论超过边界还是正好处于边界,都取最小值 )
如果你能看懂上面说的是什么,那么你就大体了解了Manacher算法
现在开始分析:
因为 和 是关于 的对称点,而 子串(以 为中心的最长回文子串,下同
)肯定是左右对称且包含了 子串(前提),那么 子串必定与 子串对称,所以可以直接继承已经计算过的 的最长子串长度 ,即
在这种情况下, 子串并不完全包含在 子串中,但是容易看出的是, 子串至少会有 的长度(正好达到边界),即
因此 子串的长度取这两种情况的最小值 ,即:
证毕#
补充说明一下: 子串的长度如果超过边界 ,那么先取最小值 ,再接下去匹配过程中会继续判断超过 的部分是否对称