题意: 给一个串,\(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
标签:
留言评论