给定一个长度为 n 的由小写字母构成的字符串,求它的最长回文子串的长度是多少。
输入格式
一个由小写字母构成的字符串。
输出格式
输出一个整数,表示最长回文子串的长度。
数据范围
1≤n≤107
输入样例:
abcbabcbabcba
输出样例:
13
维护一个最长回文子串的右端点
#include <iostream> #include <cstring> using namespace std; constexpr int N=2e7+10; int p[N]; char a[N],b[N]; int n,mr,mid; 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; } void manacher(){ for(int i=0;i<n;i++){ if(i<mr) p[i]= min(p[mid*2-i],mr-i); else p[i]=1; while(b[i-p[i]]==b[i+p[i]]) p[i]++; if(i+p[i]>mr){ mr=i+p[i]; mid=i; } } } int main(){ scanf("%s",a); n= strlen(a); init(); manacher(); int ans=0; for(int i=0;i<n;i++){ ans= max(ans,p[i]); } printf("%d\n",ans-1); }