#include <bits/stdc++.h>
using namespace std;
const int maxn=11000000+5;
string ma="@#";
int mp[2*maxn]; //存放回文串长度+1
void manacher(string s){
int len=s.size();
for (int i=0; i<len; i++){
ma+=s[i];
ma+='#';
}
int nlen=ma.size();
int mx=0,id=0; //mx为最右端位置,id为能延伸到最右边的字符串的中心位置
for (int i=0; i<nlen; i++){
mp[i]=(i>mx)?1:min(mp[2*id-i],mx-i); //每次取小赋值,防止超过mx
while (ma[i+mp[i]]==ma[i-mp[i]]) mp[i]++;
if (i+mp[i]>mx){
mx=i+mp[i];
id=i;
}
}
}
int main(){
ios::sync_with_stdio(false);
string s;
cin>>s;
int len=s.size();
manacher(s);
int ans=0;
for (int i=0; i<2*len+2; i++)
ans=max(ans,mp[i]-1);
cout<<ans;
return 0;
}
Manacher算法——最长回文子串
最新推荐文章于 2024-09-08 15:45:17 发布