[关闭]
@Falsyta 2018-03-26T04:40:10.000000Z 字数 1448 阅读 1184

题解

未分类


答案可以分为两部分,在字典串中出现的和在字典串之间出现的,前者容易计算,对于后者,我们考虑出现位置中第一个标号序列中的位置是 ,枚举 ,查询 即可,其中 表示 中的出现次数

Part 1.

定义
定理:令 ,其中 是一个单调不降的序列,则 可以被表示成 个等差数列顺次连接起来。
Proof. 的前缀,因此只有两种情形:
1. :长度 /2 ,不需要处理
2. :必然会出 period ,我们可以把形如 的位置压成一个等差数列,其中 是 period 长度。则处理后的 ,其中 是第一个不在等差数列里的下标。
得证。

于是问题来到怎么求 ,容易在 的时间内求出 ,注意到如果 则必然 ,于是我们就可以在 的时间内由 求出 (以及求出 ),而注意到在等差数列里我们只要知道第一项和第二项的位置就可以求出整个等差数列。因此我们就可以在 的时间内求出 。注意到其实我们只需要求出 ,因为序列的其余部分是可以预处理后直接用 回答出来的。于是就可以用 的时间内求出来。

我们要求 ,把串分为 ,我们就是要求 ,然后把两部分结果合并起来(求 ),这个可以把两部分归并起来计算贡献即可。复杂度

Part 2. (offline) / (online)

我们要查询 。在考虑 这个串的贡献的时候,我们把 这个后缀标号为 ,而要查询的和就是查询在整个 Trie 上 SAM 的对应节点的子树里有多少后缀节点的标号 ,考虑这就是一个二维数点, 个点,如果离线的话还是可以做到 预处理 回答,如果在线的话可能就要变成 了。

综上,取 ,复杂度为 (Offline)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注