0分的看这里
查看原帖
0分的看这里
556740
hzx360楼主2024/8/1 20:13

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]p[i] 值,那么有可能会以这个位置为中心然后对称出一个不符合条件的字符串。

例子:#1#0#0# 第三个#处的p[i]应该为1,但如果写的是i++那p[i]就会算成3

2024/8/1 20:13
加载中...