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