manacher模板题。
这里推荐这篇博文,讲得很清晰,一下就懂了。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char a[220005];
int len, p[220005];
int manacher(){
int id=0, mx=0, maxlen=0;
len = len * 2 + 1;
for(int i=1; i<len; i++){
if(i<mx) p[i] = min(p[2*id-i], mx-i);
else p[i] = 1;
while(a[i-p[i]]==a[i+p[i]]) p[i]++;
if(mx<i+p[i]) mx = i + p[i], id = i;
maxlen = max(maxlen, p[i]);
}
return maxlen;
}
int main(){
while(scanf("%s", a)!=EOF){
len = strlen(a);
for(int i=len; i>=0; i--){
a[2*i+2] = a[i];//为了让' '也过去
a[2*i+1] = '#';
}
a[0] = '$';
printf("%d
", manacher()-1);
}
return 0;
}