社区讨论
警示后人:如果你把两个串合起来算且 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 串 位置的 时,应满足 。
但是为了避免这种情况,你不能用这种方法求解 z 函数:
CPPfor(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;
}
注意到越界本身对计算前缀这种东西没有影响(即使从 开始的 lcp 跑到了 的范围里去,它依然是和 的 lcp,可以参与对各 的贡献),因此我们只需在统计答案时取个
min 即可,不需要 for 循环里的那一句话。回复
共 2 条回复,欢迎继续交流。
正在加载回复...