在这篇题解中,使用如下代码求出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?