更好的阅读体验
题意
给定 n 个字符串 S1...n.
定义 occur(t,s) 为 字符串 t 在字符串 s 中的出现次数. 有 q 次询问,每次给出 l,r 和 k,输出 ∑l≤i≤roccur(si,sk).
n,k,∑|si|≤105
题解
我们对所有串建立fail树
令 pi,j 表示串 si 的前 j 个字符在AC自动机上对应点的编号,endi 表示串 si 在AC自动机上对应点的编号
有
∑l≤i≤roccur(si,sk)=∑l≤i≤r∑1≤j≤lenkisanc(endi,pk,j)
其中 isanc(x,y) 表示在fail树上 x 是否为 y 的祖先
看到 ∑|si|≤105 这条限制,容易想到对于 |sk| 根号分治
令 M=∑|si|
- |sk|<=T
容易得到一种做法,∀l≤i≤r,对所有以 endi 为根的子树的所有点加1,然后查询所有 pk,i 点上的值之和
把每个询问差分为成 [1,l−1] 和 [1,r] 两个区间,然后离线下来按右端点排序,维护区间修改单点查询
树状数组可以做到 O(qTlogM+nlogM),当然更快的做法是分块的 O(qT+n√M)
- |sk|>T
满足这个条件的 k 数量是 O(MT) 级别的,因此我们考虑对所有的 k 预处理
考虑另一种做法,把所有 pk,i 标上1,然后查询 ∀l≤i≤r,endi 子树和之和
预处理时我们对 endi 的子树和做前缀和,询问的差分即可
O(q+MT×n)
选择一个合适的 T,我们视 n,M 和 q 为同阶,T 取 √M 即可
复杂度可以简单地认为是 O(n√M)
代码 codeforces submission 144319232
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构