还是很简单的 搞清楚几种状况就可以,
证明网上都有
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+5;
char s[maxn],str[maxn];
int len,len1;
int p[maxn];
void init()
{
str[0] = '*';
str[1] = '#';
int len = strlen(s);
for(int i = 0; i < len; i ++){
str[i*2 + 2] = s[i];
str[i*2 + 3] = '#';
}
len1 = len*2 + 2;
str[len*2 + 2] = '$';
}
void manacha()
{
int id = 0,mx = 0;
for(int i = 1; i < len1; i ++){
if(mx > i) p[i] = min(p[2*id - i], mx - i);
else p[i] = 1;
for(; str[i + p[i]] == str[i - p[i]];p[i]++);
if(i + p[i] > mx){
mx = i + p[i];
id = i;
}
}
}
int main()
{
while(scanf("%s",s)!= EOF){
len =strlen(s);
init();
manacha();
int ans = 0;
for(int i = 0; i < len1; i ++){
ans = max(ans, p[i]);
}
printf("%d\n",ans - 1);
}
}