LGP7582口胡

Posted 欢迎来到lmppの小窝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LGP7582口胡相关的知识,希望对你有一定的参考价值。

他说风雨中这点痛算什么,擦干泪不要怕,至少我们还有梦

首先弄明白一件事:区间 ACAM 可以看做是所有串的 ACAM 只保留区间串对节点贡献的信息,仍然可以使用所有串的 ACAM 的转移边。

于是我们可以使用 ACAM 套线段树,每颗线段树维护这个节点会受到区间哪些位置的串的贡献。

但是这这样有一个问题,修改操作不太容易实现。

那么我们还需要再套一层数据结构来解决这个修改。区间询问一般考虑线段树和分块。线段树的话修改操作会涉及过多的节点,所以我们选择分块。

设块长为 \\(B\\)。对每个块的 ACAM 维护两种类型的值:\\(V[u]\\) 表示不计算整体加 \\(tag\\) 的权值之和,\\(c[u]\\) 表示这个节点包含的串的个数。

我们是很容易通过这两个数组来计算一个节点的权值的。对于整块我们可以这样做到 \\(O(\\sum|S|\\fracnB)\\) 个询问操作。

散块的修改操作需要暴力进行,涉及到的 ACAM 节点个数是 \\(O(\\sum|s|)\\) 级别的。不过可以知道需要修改的 ACAM 节点是 \\(O(B)\\) 个。所以修改操作是 \\(O(mB)\\) 个。

但是询问就比较麻烦了。前面提到可以将区间 ACAM 看做是所有串的 ACAM 只保留区间串对节点贡献的信息,所以对于每个块的 ACAM 都套上一颗线段树,维护哪些串贡献这个节点。

但是查询的时候只能暴力把这个集合弄出来一个一个加。不过由于加的是字符串的信息所以是 \\(O(1)\\) 维护的。

查询散块的复杂度为 \\(O(\\sum|S|B)\\)

注意到前面的询问次数过多,线段树这种东西是不能胜任的,考虑对 dfn 序分块。

每次修改相当于子树加,也就是区间加。我们将 fail 树的 dfn 序分成块长为 \\(T\\) 的块。每次修改暴力加后缀,然后 \\(O(B)\\) 次操作结束后进行一个块的前缀和。

那么就是 \\(O(\\sum|S|\\fracnB+mBT+\\frac\\sum|S|mT)\\)\\(T\\)\\(\\sqrt\\frac\\sum|S|B\\) 可以得到 \\(O(\\sum|S|\\fracnB+m\\sqrt\\frac\\sum|S|B)\\) 的复杂度。

\\(B\\)\\(\\sqrtn\\) 即可得到 \\(O(\\sum|S|\\sqrtn+\\fracm\\sqrt[4]n\\sqrt\\sum|S|)\\) 的复杂度。

后面那玩意儿看上去很劣,但是 \\(n,m\\)\\(\\sum|S|\\) 要少一个 \\(0\\),所以其实还好的说,拍一下计算器只有 1e6(

然后线段树合并的话,序列长度其实只有 \\(\\lfloor\\sqrt30000\\rfloor=173\\),这玩意儿还不如去用 bitset。空间几乎是线性的,不会被卡。

以上是关于LGP7582口胡的主要内容,如果未能解决你的问题,请参考以下文章

图论问题复习总结

LGP5664题解

LGP2634 [国家集训队]聪聪可可

LGP500 上的意图 RECORD_SOUND_ACTION

lgP2843

LGP4886 快递员