ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LGP7582口胡

2022-03-28 10:01:26  阅读:125  来源: 互联网

标签:线段 frac sum sqrt 节点 LGP7582 ACAM


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

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

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

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

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

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

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

散块的修改操作需要暴力进行,涉及到的 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|\frac{n}{B}+mBT+\frac{\sum|S|m}{T})\),\(T\) 取 \(\sqrt{\frac{\sum|S|}{B}}\) 可以得到 \(O(\sum|S|\frac{n}{B}+m\sqrt{\frac{\sum|S|}{B}})\) 的复杂度。

\(B\) 取 \(\sqrt{n}\) 即可得到 \(O(\sum|S|\sqrt{n}+\frac{m}{\sqrt[4]{n}}\sqrt{\sum|S|})\) 的复杂度。

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

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

标签:线段,frac,sum,sqrt,节点,LGP7582,ACAM
来源: https://www.cnblogs.com/lmpp/p/16065728.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有