P7361 「JZOI-1」拜神 (字符串)

乎语百科 326 0

题意: 给一个串,\(Q\) 次询问区间 \([l,r]\) 中至少出现两次的子串的最大长度。

写LCT是什么东东

以下做法很经典:

先求出 SA 以及 height 数组,然后按 height 从大到小每次加入一条连接 \(sa_i\) 与 \(sa_{i+1}\) 的边,并用并查集维护每个连通块。 这样由经典结论 \(\mathrm{lcp}(i,j)=\min_{rank_i\le rank_k\le rank_j-1}\{height_k\}\) 可知,若已加的边中 height 最小值为 \(k\),那么 \(\mathrm{lcp}(i,j)\ge k\) 当且仅当 \(i,j\) 当前在同一连通块内。

在本题中,每次使用启发式合并+可持久化线段树维护每个 \(i\) 在连通块中的后继(即下一个比它大的),查询时二分答案 \(L\),看长度为 \(L\) 时是否有 \(\min_{i\le k\le j}suf_k\le r-L+1\) 即可。

时间复杂度 \(O(n\log^2n)\)。这玩意不好过LCT

标签:

留言评论

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~