为啥题解输出的答案是对的啊
查看原帖
为啥题解输出的答案是对的啊
269681
wbwone1楼主2022/5/23 09:41

这篇题解中,使用如下代码求出str每一个后缀的所有前缀的next数组:

for(int i=1;i<=n;i++){
            next[i][i]=0;
            for(int j=i+1,v=0;j<=n;j++){
                while(v && str[j] != str[i+v])v=next[i][v];
                if(str[j]==str[i+v])v++;
                next[i][j]=v;
            }
        }

但是,如果我们稍加改动,变为

for(int i=1;i<=n;i++){
            next[i][i]=0;
            for(int j=i+1,v=0;j<=n;j++){
                while(v && str[j] != str[i+v])v=next[i][v+i-1];
                if(str[j]==str[i+v])v++;
                next[i][j]=v;
            }
        }

也就是将while循环中的v = next[i][v]变为v = next[i][v+i-1]。

之后,我们输出每一个next[i][j]。

对于下面的数据,两个程序给出了不同的next结果:

cabbabcbbb
*

我们发现next[3][10]的值不一样,第一份代码给出的是1,第二份给出的是2。

显然,根据next的定义,此处的值应该为2。即第一个程序在求解next数组时出现了问题。

但是,这两个程序都能通过此题,于是,问题变成了是否能证明其正确性或给出hack?

2022/5/23 09:41
加载中...