Loading

[ICPC2020 Nanjing R] Baby's First Suffix Array Problem

提供一个 \(O(n \log n)\) 的做法。

考虑先认为 \(S[x,r]<S[k,r]\) 的充要条件为 \(rk_{x}<rk_{k}\),再修正算错的部分,可以发现算错的部分有两种:

\(1.\) \(x<k\) 的部分,此时要满足 \(S[k,r]\)\(S[x,r]\) 的一个 \(\text{border}\)\(S[x,n]<S[k,n]\),即 \(lcp(S[x,n],S[k,n])\geqslant n-k+1\)\(rk_{x}<rk_{k}\),这个在 \(\text{rk}\) 数组上对应一段连续的区间,可以直接二维数点解决。

\(2.\) \(x>k\) 的部分,此时要满足 \(S[x,r]\)\(S[k,r]\) 的一个 \(\text{border}\)\(S[k,n]<S[x,n]\),即对于 \(S[k,r]\) 的所有真 \(\text{border}\),长度为 \(len\) 的贡献为 \([rk_{r}<rk_{r-len+1}]\),求所有 \(\text{border}\) 的贡献和。由于一个串的 \(\text{border}\) 形成 \(\text{log}\) 段等差数列,每一段等差数列都形如 \((ST)^tS\) 的形式,对于同一个等差数列约束形如 \((TS)^tA>B\)\(t\) 对应的是一段前缀或一段后缀,二分分界点即可,令等差序列长度为 \(l\),这部分要 \(\log_{2} l\) 的代价,而 \(\prod_{i=1}^{m}(l+1)\leqslant n\),所以 \(\sum_{i=1}^{m}\log_2(l+1)\leqslant \log_{2}n\)。加上用基本子串字典求解 \(\text{border}\) 等差数列的复杂度,于是这部分可以做到 \(O(n \log n)\)

综上我们在 \(O(n\log n)\) 的复杂度内解决了该问题,但实际上跑得比一部分 \(O(n\log^2n)\) 的分治做法还要慢,原因可能是基本子串字典常数太大了。

posted @ 2024-05-04 19:09  zhouhuanyi  阅读(25)  评论(0编辑  收藏  举报