Manacher

对于 Manacher 部分的理解,推荐阅读前有一定了解

##对算法本身的部分理解:

1
2
3
4
if(2 * maxn - i >= 1)	
f[i] = min(f[2 * maxn - i],maxr - i);
else
f[i] = maxr - i;

关于这个算法,最难以理解的部分也就这里,也就是判断 ii 的最长回文长度的下界。

首先定义 jjii 关于 maxnmaxn 的对称点,mxrmxr 为已有回文半径覆盖到的最右点maxnmaxn 为其的中心点

首先关于 jj 的寻找,因为 maxn=ij2maxn = \frac{i-j}{2},所以可以化简得:2×maxn=ij2\times maxn = i - j,所以 j=2×maxnij = 2\times maxn - i

关于第一行的判断条件,也就是在判断 jj 的存在,然后看后面的两种情况。

1:若 f[j]<maxrif[j] < maxr - i,我们选择的下界会是 f[j]f[j],则有下图

​ 其中用红线代表 i,ji,j 的回文范围,maxrimaxr- i 也就是 iimaxrmaxr 的距离。首先因为这一长段都是以 maxnmaxn 为中心的回文子串,所以其实以 jj 为中心的回文子串也在以 ii 为中心的回文子串那里(不一定完整),因为 jj 的回文半径小于 iimaxrmaxr 的距离,所以以 jj 为中心的整个回文串都完整地到了 ii 的地方,所以对于 ii 来说它的回文半径的下界也就是 jj 的回文半径。之所以说是下界,因为超过这个下界的 ii 的右边可能有一些值仍然可以和 ii 的左边匹配,因为超过部分不一定和 jj 那里一样,所以是下界。

2:若 f[j]>maxrif[j] > maxr - i,我们选择的下界会是 maxrimaxr - i,则有下图:

此时也就相当于 jj 的回文半径的长度超过了 maxnmaxn 的限制,也就是以 jj 为中心的回文串只有一部分因为 maxnmaxn 的限制而来到了 ii 的位置,而这一部分的长度也就是 jjmaxnmaxn 限制的左端点的距离,也就是 maxrimaxr - i 那么因为这一段有 maxnmaxn 的限制再加上在 jj 是回文的,所以也一定是回文的

作者

linyihdfj

发布于

2022-03-29

更新于

2023-09-14

许可协议