CF587F Duff is Mad

更好的阅读体验

题意

给定 n 个字符串 S1...n.
定义 occur(t,s) 为 字符串 t 在字符串 s 中的出现次数. 有 q 次询问,每次给出 lrk,输出 liroccur(si,sk).

n,k,|si|105

题解

我们对所有串建立fail树

pi,j 表示串 si 的前 j 个字符在AC自动机上对应点的编号,endi 表示串 si 在AC自动机上对应点的编号

liroccur(si,sk)=lir1jlenkisanc(endi,pk,j)

其中 isanc(x,y) 表示在fail树上 x 是否为 y 的祖先

看到 |si|105 这条限制,容易想到对于 |sk| 根号分治

M=|si|

  • |sk|<=T
    容易得到一种做法,lir,对所有以 endi 为根的子树的所有点加1,然后查询所有 pk,i 点上的值之和
    把每个询问差分为成 [1,l1][1,r] 两个区间,然后离线下来按右端点排序,维护区间修改单点查询
    树状数组可以做到 O(qTlogM+nlogM),当然更快的做法是分块的 O(qT+nM)
  • |sk|>T
    满足这个条件的 k 数量是 O(MT) 级别的,因此我们考虑对所有的 k 预处理
    考虑另一种做法,把所有 pk,i 标上1,然后查询 lirendi 子树和之和
    预处理时我们对 endi 的子树和做前缀和,询问的差分即可
    O(q+MT×n)

选择一个合适的 T,我们视 nMq 为同阶,TM 即可
复杂度可以简单地认为是 O(nM)

代码 codeforces submission 144319232

posted @   gzezFISHER  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示