20.Manacher
Manacher
引入
Manacher 算法可以在
先需要改造原字符串,在字符之间和两端插入 #,改造后,都变成了奇回文串,并把 $
那么,aba 就改造成 $#a#b#a# 了
我们定义回文半径
加速盒子
实现
计算前
- 如果
,则 的对称点为 - 若
,则 - 若
,则令 ,从 往后暴力枚举
- 若
- 如果
,则从 开始暴力枚举 - 求出
后,如果 ,则更新盒子
auto manacher(string a) {
string s = "$#";
for (int i = 0; i < a.size(); i++)
s += a[i], s += '#';
vector<int> d(s.size());
d[1] = 1;
for (int i = 2, l, r = 1; i < s.size(); i++) {
if (i <= r) d[i] = min(r - i + 1, d[r - i + l]);
while (s[i - d[i]] == s[i + d[i]]) d[i] ++;
if (i + d[i] - 1 > r)
l = i - d[i] + 1, r = i + d[i] - 1;
}
return d;
}