manachar() 函数:
void manacher(){
int R=0,C;
for(int i=1;i<=n;i+=2){
if(i<=R) p[i]=min(p[(C<<1)-i],p[C]+C-i);
else p[i]=1;
while(i+p[i]<=n and i-p[i]>=1 and check(i+p[i],i-p[i])) p[i]++;
if(i+p[i]-1>R) R=i+p[i]-1,C=i;
ans+=(p[i]-1)/2;
}
}
其中的循环要写成:for(int i=1;i<=n;i+=2)
原因是如果考虑偶数位的 p[i] 值,那么有可能会以这个位置为中心然后对称出一个不符合条件的字符串。
例子:#1#0#0# 第三个#处的p[i]应该为1,但如果写的是i++那p[i]就会算成3