题解:P13960 [ICPC 2023 Nanjing R] 后缀结构
Larunatrecy · · 题解
首先
因此问题等价于,初始时所有节点上都有一个棋子,进行
对于一个结点
- 如果
d_v\geq k ,设w 为v 的k 级祖先,那么从u 出发和从w 出发,k 步之后到的点是一样的,k 步之前因为都是向下走,所以对答案的贡献都是一个公差为1 的等差数列,我们可以弥修正以下这两个贡献的差,然后把从u 出发的看作是从w 出发的,注意显然有d_w<d_u 。 - 如果
d_v<k ,那么可以发现从u 出发和从根节点0 出发,k 步之后到的点是一样的(这是因为,因为现在匹配的最长后缀长度<k ,所以和原本的s_i 没有任何关系,因此s_u+T_j 的最长后缀就等价于T_j 的最长后缀),所以我们可以类似的把u 出发的看作是从w 出发的,同样需要对答案做一个修正,可以发现这里的贡献只和u 的深度有关,因此可以开个桶存一下每个深度的u 的贡献,最后可以线性得到答案。
可以在每个节点是维护一个次数
这里是线性的。
还有一些实现细节:
- 建立 AC 自动机,可以发现 AC 自动机不能暴力跳 fail,而找 fail 实际上就是 fail 链上第一个有某个字符出边的点,可以用可持久化线段树维护每个结点是否有某个字符的出边,这部分是
1\log 。 - 对每个
u 找出第一次跳 fail 的点,可以用二分哈希。
时间复杂度