manacher求回文串
复杂度o(n)级别
#include<bits/stdc++.h>
using namespace std;
int manacher(string s){
string t="$#";
for(int i=0;i<s.size();i++){
t+=s[i];
t+="#";
}
// cout<<t.size();
vector<int>p(t.size(),0);
int mx=0,id=0,recenter=0,relen=0,max1=-1;
for(int i=1;i<t.size();i++){
p[i]=mx>i?min(mx-i,p[2*id-i]):1;
while(t[i + p[i]] == t[i - p[i]]) p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
id=i;
}
if(p[i]>relen){
relen=p[i];
recenter=i;
}
max1 = max(max1, p[i] - 1);
}
return max1;
//如果想要返回回文串
// return s.substr((recenter - relen) / 2 , relen - 1) ;
}
int main(){
string s;
getline(cin,s);
cout<<manacher(s);
return 0;
}