manacher 算法

发布时间 2023-07-13 21:34:44作者: NuclearReactor

算法简介

manacher 算法是一个求字符串中最长回文连续子序列的算法,可以达到 \(O(n)\) 的复杂度。

算法

我们可以在每一个字符之间补上一个 ‘#’ 这样所有的回文串就都会变成长度为奇数的回文串,我们用 \(len_i\) 表示从 \(i\) 点能够扩展出的回文长度(包括自身)最长是多少,\(maxright\) 表示已经触及到的最右边的字符,\(mid\) 表示 \(maxright\) 所对应的对称轴。

如图:

然后我们发现,\(len_i\)​ 的值至少是 \(\min(len_j,maxright-i+1)\)​​ 。然后我们就可以从这个位置开始扩展,直到不能扩展。

复杂度证明

因为 maxright 是单调不减的,所以 while 语句均摊下来仍然是 \(O(n)\)