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

题意: 给一个串,\(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

posted @ 2022-10-05 22:34  CharlieVinnie  阅读(136)  评论(0编辑  收藏  举报