Manacher
对于 Manacher 部分的理解,推荐阅读前有一定了解
##对算法本身的部分理解:
1 | if(2 * maxn - i >= 1) |
关于这个算法,最难以理解的部分也就这里,也就是判断 的最长回文长度的下界。
首先定义 为 关于 的对称点, 为已有回文半径覆盖到的最右点, 为其的中心点
首先关于 的寻找,因为 ,所以可以化简得:,所以
关于第一行的判断条件,也就是在判断 的存在,然后看后面的两种情况。
1:若 ,我们选择的下界会是 ,则有下图
其中用红线代表 的回文范围, 也就是 到 的距离。首先因为这一长段都是以 为中心的回文子串,所以其实以 为中心的回文子串也在以 为中心的回文子串那里(不一定完整),因为 的回文半径小于 到 的距离,所以以 为中心的整个回文串都完整地到了 的地方,所以对于 来说它的回文半径的下界也就是 的回文半径。之所以说是下界,因为超过这个下界的 的右边可能有一些值仍然可以和 的左边匹配,因为超过部分不一定和 那里一样,所以是下界。
2:若 ,我们选择的下界会是 ,则有下图:
此时也就相当于 的回文半径的长度超过了 的限制,也就是以 为中心的回文串只有一部分因为 的限制而来到了 的位置,而这一部分的长度也就是 到 限制的左端点的距离,也就是 那么因为这一段有 的限制再加上在 是回文的,所以也一定是回文的