如果你 WA on #1
查看原帖
如果你 WA on #1
773503
Falling_Sakura楼主2023/8/14 23:14

如你所见,我求了两遍 Z 数组,因为第二问可以通过拼接法解决,但是 ll 和 rr 初始化记得要比枚举变量的初始值少1,因为你在找之前求过的公共部分时,也就是 r−i+1r-i+1,初始是需要特判 z0=nz_0=n 和zn−1=xz_{n-1}=x的,如果不这样就会直接判断 z0<1z_0<1,然后就直接把 z0z_0赋值为0,那 nn呢?它的上一项 zn−1z_{n-1} 已经预处理出来了,按理来说都设为n就没问题了啊,但是注意我们 l,rl,r 的定义,是一个 Z−BoxZ-Box,是应该已经求出来的,而求出来的其实是 n−1n-1,nn是待求项,如果强行这样做的话,会导致还没比较就先继承了1的匹配长度,会出问题。

正确代码:

for(int i=1,l=0,r=0;i<n;i++)
    {
        if(z[i-l]<r-i+1) z[i]=z[i-l];
        else
        {
            z[i]=max(r-i+1,0);
            while(i+z[i]<n&&b[z[i]]==b[i+z[i]]) z[i]++;
            l=i,r=i+z[i]-1;
        }
    }
for(int i=n,l=n-1,r=n-1;i<n+m;i++)
    {
        if(z[i-l]<r-i+1) z[i]=z[i-l];
        else
        {
            z[i]=max(r-i+1,0);
            while(i+z[i]<n+m&&b[z[i]]==b[i+z[i]]) z[i]++;
            l=i,r=i+z[i]-1;
        }
    }
2023/8/14 23:14
加载中...