不想用 SAM,使用的 SA 做法的,问题出在 t=1 的部分。
我的做法是,后缀排序后,设置两个头尾指针 bp 和 ep(begin position 和 end position)代表我们目前锁定的 可能包含 答案子串所在的后缀 的 编号闭区间。
一位一位确定答案,初始时 bp=1,ep=n,进行如下几步:
- 一位一位减小 ep,直到 bp∼ep 所包含的子串总数是最后一个 ≥k 的。
- 再将 ep 一位位后移到 chk 位置,满足 ep∼chk 的当前位都是相同的,且 chk+1 的当前位是不同的。(∗)
- 一位一位增加 bp,直到 bp∼ep 的当前位都是相同的,在这个过程中 k 不断减小相应值。
- 此时已经锁定了当前位,以及下一步的可行区间 [bp,ep]。
- 检查答案是不是 bp∼ep 的 LCP,如果是,直接输出,否则 k 减小相应值,重复上面过程。
可以发现,如果没有 (∗) 这一步,那么处理过程的复杂度就是完美的 O(n),但现在加上这一步复杂度会变成什么样呢?能否给个界限估计,或者卡掉这个做法?
提交记录在此 https://www.luogu.com.cn/record/68064104,是目前的最优解 rank 1
二楼直接贴出相应部分代码