CF1098F Ж-function

题意:给出一个字符串 。

定义函数 为 的每个后缀与 的 之和。

询问 次,每次给出 ,求 。

,时限 。


后缀 的 即为后缀树上 两点 的 。即 先不考虑 ,单看 ,这是 Luogu4211 [LNOI2014]LCA。这对本题有启示。

考虑 的一个祖先 ,其返祖边的贡献系数。在 P4211 中,贡献系数是 子树内 内的点数。即 是的祖先是的子孙 而在本题中,。贡献系数是 子树内 内的点数。

也即 是的祖先是的子孙 注意这里考虑的是未压缩的后缀树。

利用 可得

是的祖先是的子孙 可以拆成 分别计算。

是的祖先是的子孙

模仿 Luogu4211 将点 到根的链上加一,然后查询 到根的链上,深度不超过 的点权和。

转到压缩后缀树上计算时有一些细节。

使用树链剖分,复杂度是 。

后者可以看作计算 到根的链上深度不超过 的部分每个点 子树中 内的点数。

把树重链剖分,一个询问中符合条件的 会被分到 条重链上计算。

对于一条重链,参与贡献的 在重链顶的子树中,而重链顶子树大小和是 的。

对于询问 ,考虑一对 能贡献的条件。

  • ①

  • ② 是的祖先

    设 与重链的 为 ,等价于 。

  • ③ 是的子孙

    设 与重链的 为 ,等价于 。

  • ④

    即

我们把满足条件 ① 的点对 变成二维平面上的点 。

对于询问 ,就是要计算矩阵 以内的点数。这就是二维偏序了。

然而,满足 ① 的点对 可能很多,不能暴力加入,考虑观察这些点对的性质。

对于一个 ,满足条件的 是一个前缀() 。转化成 之后,则是一条斜线(上连续的若干整点)。

而前面说了, 的总规模是 的,那么需要加入的斜线条数也是这个量级。

问题完全转化成了这些“斜线”的二维偏序,如图。

把斜线段拆成两条斜射线的差。我们可以断言,一条斜射线必然穿过限制矩形的右侧(蓝色)或者上侧(绿色),如图。

对于穿过右侧的斜射线,其在矩形内的长度为起始点 坐标与右边界 坐标的差。

对于穿过上边界的,则和 坐标有关。考虑分别统计。

若矩形右上角为 直线 与 的交点会是 。

若 则与右侧相交。区间求和即可。需要维护 坐标和以及起始点个数。

对于与上侧相交的情况,翻转坐标系处理即可。

总复杂度 。

代码实现较为复杂,我写了整整一天……