M a n a c h e r A l g o r i t h m \mathrm{Manacher\ Algorithm} Manacher Algorithm
Manacher 算法主要是解决怎样的问题呢,其实是求解最长的回文串,但是只能找到长度为奇数的回文串,不过可以通过转化使得能够求解任意长度的回文串。
例题:P3805 【模板】manacher
A l g o r i t h m F l o w \mathrm{Algorithm\ Flow} Algorithm Flow
Manacher 的算法是在 O ( n ) O(n) O(n) 的时间复杂度内,查找对于每一个 i i i,最大的回文半径 p i p_i pi 是多少?
从左往右递推做,在递推的过程中,每一次维护右端点最靠右的回文串的中心位置 m i d mid mid,以及该回文串最靠右的位置 m r mr mr(通常不包含该回文串最靠右的位置,即为该位置 + 1 +1 +1)。(如图)

那么,对于求解 i i i 的 p i p_i pi,可以分情况讨论:
- i i i 在 m r mr mr 的左边,即在 m i d mid mid 所在回文串的内部。那么,充分利用已经算过的信息,考虑 i i i 在该回文串内的对应点 j j j,其中 j = m i d × 2 − i j=mid\times 2 - i j=mid×2−i。

- 若 j j j 所在的最大回文串仍然在 m i d mid mid 所在回文串的范围内,则 p i ≥ p j p_i\ge p_j pi≥pj。(何时取 ≥ \ge ≥,当且仅当 j j j 的左端点恰好为 m i d mid mid 所在回文串的左端点时)
- 若 j j j 所在的最大回文串超出了 m i d mid mid 所在回文串的范围,则 p i = m r − i p_i=mr-i p