首先建 SAM,然后问题转化为在 Parent Tree 上编号在 [l,r] 内的点对的 LCA 的深度的最大值。
考虑一个贪心,先在树上做一次启发式合并,维护子树内代表前缀的结点,然后启发式合并时把每个点的前驱后继找出来,与该点形成数对产生贡献。
然后就变成了一个二维数点问题了。
容易发现点对数量规模和启发式合并的复杂度是相同的。
但是我是来写 LCT 的(
考虑从左到右枚举右端点然后维护对应左端点的答案,那么右端点增加一时,要检查其对应结点到根的链上的点维护的最晚出现位置和当前右端点的贡献,然后把它们的最晚出现位置改成当前右端点。
同时在 BIT 上维护后缀最大值即可。
代码:
1 |
|