注意看,我在马拉车之前做了些奇奇怪怪的预处理,用特殊字符填充了边界,所以我就不需要做边界判断了。
但是我发现把while中的边界判断去掉的话,是AC不了的。
void Manacher(){
int l=0,r=0;
string str="@"+s+'!';
for(int i=1;i<=n;i++){
if(i<r){
int j=l+r-i;
p[i]=min(p[j],j-l);
}
while(i-p[i]-1>=1 and i+p[i]+1<=n and str[i-p[i]-1]==str[i+p[i]+1]) p[i]++;
if(i+p[i]>r) {
r = i + p[i];
l = i - p[i];
}
}
}