社区讨论

警示后人:如果你把两个串合起来算且 TLE #7,12

P5410【模板】扩展 KMP / exKMP(Z 函数)参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjrn7kl
此快照首次捕获于
2025/11/04 07:23
4 个月前
此快照最后确认于
2025/11/04 07:23
4 个月前
查看原帖
由于把两个字符串拼起来算,因此两个数组不能越界,例如计算 b 串 ii 位置的 ziz_i 时,应满足 i+zisize(b)i+z_i \le size(b)
但是为了避免这种情况,你不能用这种方法求解 z 函数:
CPP
for(int i=1,l=0,r=0;i<len;i++){
  if(i<=r&&z[i-l]<r-i+1)z[i]=z[i-l];
  else{
    z[i]=max(0,r-i+1); 
    while(i+z[i]<len&&b[z[i]]==b[i+z[i]])++z[i];
  }
  if(i<len2)z[i]=min(z[i],len2-i);// 这里
  if(r<i+z[i]-1)l=i,r=i+z[i]-1;
}
注意到越界本身对计算前缀这种东西没有影响(即使从 bib_i 开始的 lcp 跑到了 aa 的范围里去,它依然是和 bb 的 lcp,可以参与对各 aia_i 的贡献),因此我们只需在统计答案时取个 min 即可,不需要 for 循环里的那一句话。

回复

2 条回复,欢迎继续交流。

正在加载回复...