manacher算法
原串回文串终点的求法:
原串回文串的长度为
M
L
C
[
P
O
S
(
a
f
t
e
r
)
]
MLC[POS(after)]
MLC[POS(after)]。
原理可参考 https://zhuanlan.zhihu.com/p/70532099,但是他的回文半径和这里的描述相差1,整体逻辑是一样的都是正确的,描述方法不一样而已。
然后还有提一个关于leetcode上初始化
f
(
i
)
f(i)
f(i)的理解模型:
manacher实现的一个重要过程:
就是不用每次都通过拓展的方式(像双指针那样)去找f(i)。而是通过前面已知的f(i)=f(j)或者(f(i)=rmax-i+1)初始化,当求得得f(i)不是最大时,再拓展,这样就节省了拓展得时间。
当求出的 i 的右边界r大于当前的
r
m
a
x
r_{max}
rmax时,我们就需要更新 im和
r
m
a
x
r_{max}
rmax 为当前的回文串了。因为我们必须保证 i 在
r
m
a
x
r_{max}
rmax 里面,所以一旦有更右边的 r就要更新
r
m
a
x
r_{max}
rmax。