求助时间复杂度分析
查看原帖
求助时间复杂度分析
51971
syksykCCCPAHs楼主2022/1/26 22:59

不想用 SAM,使用的 SA 做法的,问题出在 t=1t=1 的部分。

我的做法是,后缀排序后,设置两个头尾指针 bpbpepep(begin position 和 end position)代表我们目前锁定的 可能包含 答案子串所在的后缀 的 编号闭区间。

一位一位确定答案,初始时 bp=1,ep=nbp = 1, ep = n,进行如下几步:

  • 一位一位减小 epep,直到 bpepbp \sim ep 所包含的子串总数是最后一个 k\ge k 的。
  • 再将 epep 一位位后移到 chkchk 位置,满足 epchkep \sim chk 的当前位都是相同的,且 chk+1chk+1 的当前位是不同的。()(*)
  • 一位一位增加 bpbp,直到 bpepbp \sim ep 的当前位都是相同的,在这个过程中 kk 不断减小相应值。
  • 此时已经锁定了当前位,以及下一步的可行区间 [bp,ep][bp, ep]
  • 检查答案是不是 bpepbp\sim ep 的 LCP,如果是,直接输出,否则 kk 减小相应值,重复上面过程。

可以发现,如果没有 ()(*) 这一步,那么处理过程的复杂度就是完美的 O(n)O(n),但现在加上这一步复杂度会变成什么样呢?能否给个界限估计,或者卡掉这个做法?

提交记录在此 https://www.luogu.com.cn/record/68064104,是目前的最优解 rank 1

二楼直接贴出相应部分代码

2022/1/26 22:59
加载中...