Manacher算法
算法思路: Manacher算法总结
- 变形串的形式:
b[0~2n+2] : $(#a[i])#^
($#^
都不能在原串中出现) - 一个结论:变形串的最长回文半径减去一,就是原串最长回文长度
Acwing 3188 - manacher算法
模板题。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e7 + 10;
char a[N], b[N];
int p[N], n;
void init()
{
int k = 0;
b[k ++ ] = '$', b[k ++ ] = '#';
for(int i=0; i<n; i ++ ) b[k ++ ] = a[i], b[k ++ ] = '#';
b[k ++ ] = '^';
n = k;
} // 0~2n+2 : $(#a[i])#^
int manacher()
{
int mid = 0, mx = 0, ans = 1; // 注意mx边界是开边界
for(int i=1; i<n; i ++ ){
if(i < mx) p[i] = min(p[2 * mid - i], mx - i);
else p[i] = 1;
while(b[i + p[i]] == b[i - p[i]]) p[i] ++ ;
if(mx < i + p[i]){
mx = i + p[i];
mid = i;
}
ans = max(ans, p[i] - 1); // 变形串的最长回文半径减去一,就是原串最长回文长度
}
return ans;
}
int main()
{
cin >> a;
n = strlen(a);
init();
cout << manacher();
return 0;
}