因为各位大佬的manacher板子实现上相差甚远
小蒟蒻整合了一个相对好写的板子以便日后贺复习
这里的回文半径 均为从位置 \(i\) 到回文串最右端位置包含的字符个数,也即包含位置i
int n;
char s[N], t[N], *c;
int d[N], ans;
scanf("%s", t); c=t;
s[++n]='$'; s[++n]='#';
while (*c) s[++n]=*(c++), s[++n]='#';
for (int i=1,mid=0,r=0; i<=n; ++i) {
if (i<r) d[i]=min(d[mid*2-i], r-i+1);
while (s[i-d[i]]==s[i+d[i]]) ++d[i];
if (i+d[i]-1>r) r=i+d[i]-1, mid=i;
ans=max(ans, d[i]);
}
printf("%d\n", ans-1);