base=131
mod=998244353
如果你使用单向链表预处理可转移的后缀,在一次判断成功的时候要将“下一个也许可行的下标”赋给“表示上一个”的变量。
说的有点抽象。我的例子:
for(int j=1;j<=n;j++){
for(int k=1;k<=j;k++)last[k]=k-1;
for(int i=j;i>=1;i--){
int len=j-i+1,now=0,prv=i;
for(int k=j;k>=1;){
if(k>=len&&getbet(k-len+1,k)==getbet(i,j)){
now++;
add(k-len+1,j,{i,now});
prv=k;
k=last[k-len+1];
}else{
k=last[prv]=last[k];
}
}
}
}
->
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++)last[k]=k-1;
for(int i=j;i>=1;i--){
int len=j-i+1,now=0,prv=j;
for(int k=j;k>=1;){
if(k>=len&&getbet(k-len+1,k)==getbet(i,j)){
now++;
add(k-len+1,j,{i,now});
k=last[k-len+1];
prv=k;
}else{
k=last[prv]=last[k];
}
}
}
}