void pre(){
str[0]='$';
int k=0;
for(int i=0;i<strlen(s);i++){
str[++k]='#';
str[++k]=s[i];
}
str[++k]='#';
}
int manacher(){
int sum=0,mx=0,id=0;
for(int i=0;i<strlen(str);i++){
if(i<mx) p[i]=min(mx-i,p[2*id-i]);
else p[i]=1;
while(str[i-p[i]]==str[i+p[i]]) p[i]++;
if(p[i]+i>mx){
mx=p[i]+i;
id=i;
sum=max(sum,p[i]);
}
}
return sum-1;
}
其中s为原字符串
str为添加符号的字符串
p为辅助数组
pre预处理
manacher返回最长回文子串