$\rm Manacher$ 是用于求解一个字符串中所有回文子串的算法
首先
如果存在一个以 $p$ 为中心
半径为 $d$ 的回文子串 , 那所有以 $p$ 为中心 , 半径小于 $d$ 的子串都是回文子串 , 证明显然 , 。
于是我们记 $d_i$ 表示以 $i$ 为中心的最大回文子串
具体过程跟 $Z$ 算法类似
-
若 $i>R$
令 $L=i-1,R=i+1$, 暴力更新, 。 -
若 $i\leqslant R~\&~d_{L+R-i}<R-i$
$d_i=d_{L+R-i}$, 。 -
若 $i\leqslant R~\&~d_{L+R-i}\geqslant R-i$
令 $L=2i-R$, 暴力更新, 。
由于 $R$ 只会往右移
但是我们发现
考虑给所有字符之间加入一个不可能出现的相同字符