SAM + dsu on tree + 线段树.
把后缀树建出来,每个前缀对应了后缀树上某个节点,询问 $[l,r]$ 的答案就是问 $[l,r]$ 内两两 LCA 中的最大 $\rm maxlen$ .
把询问离线下来,在后缀树上枚举 LCA,对它的子树做一个 dsu on tree,用 set 维护子树中所有前缀(按长度排序).
某个前缀与 set 中其他前缀的 LCA 都是我们枚举的点,只需要考虑长度是它的前驱后继的两个前缀的贡献就足够了.
于是我们可以得到若干个三元组 $(x,y,d)$ 表示前缀 $x$ 与前缀 $y$ ( $x<y$ ) 的 LCS 是 $d$ .
将三元组按 $y$ 从小到大排序,从小到大枚举 $r$ ,用线段树维护每个 $l$ 的答案即可.
时间复杂度 $O(n\log^2 n)$ .
1 | //%std |