题解:P13960 [ICPC 2023 Nanjing R] 后缀结构

· · 题解

首先 O(nm) 的暴力是简单的,我们建立 AC 自动机,那么 f(i,j) 实际上就是在 AC 自动机上跑字符串 s_i+t_j 最后到达的结点的深度。

因此问题等价于,初始时所有节点上都有一个棋子,进行 m 次移动,每次所有棋子沿着 t_i 边移动(不存在就跳 fail),求每次移动后所有结点的深度和。

对于一个结点 u,求出 k 表示 k 次移动后结点 i 第一次需要跳 fail,设跳 fail 跳到的结点是 v,分类讨论一下:

可以在每个节点是维护一个次数 c_i 代表有多少个结点被等效于从 i 出发,然后按照深度从大到小扫每个结点,这样结点会不断被合并上去,一直到最后所有节点都被合并到根。

这里是线性的。

还有一些实现细节:

时间复杂度 O((n+m)\log n)