ICode9

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

CF587F Duff is Mad

2022-02-01 10:00:44  阅读:164  来源: 互联网

标签:le end Duff text sum Mad mathcal occur CF587F


更好的阅读体验

题意

给定 \(n\) 个字符串 \(S_{1...n}\).
定义 \(\text{occur}(t, s)\) 为 字符串 \(t\) 在字符串 \(s\) 中的出现次数. 有 \(q\) 次询问,每次给出 \(l\),\(r\) 和 \(k\),输出 \(\sum\limits_{l\le i\le r}\text{occur}(s_i, s_k)\).

\(n,k,\sum |s_i|\le 10^5\)

题解

我们对所有串建立fail树

令 \(p_{i,j}\) 表示串 \(s_i\) 的前 \(j\) 个字符在AC自动机上对应点的编号,\(end_{i}\) 表示串 \(s_i\) 在AC自动机上对应点的编号

\[\sum_{l\le i\le r}\text{occur}(s_i, s_k)=\sum_{l\le i\le r}\sum_{1\le j\le \text{size}_k}\text{isanc}(end_{i}, p_{k, j}) \]

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

看到 \(\sum |s_i|\le 10^5\) 这条限制,容易想到对于 \(|s_k|\) 根号分治

令 \(M=\sum |s_i|\)

  • \(|s_k|<=T\)
    容易得到一种做法,\(\forall l\le i\le r\),对所有以 \(end_i\) 为根的子树的所有点加1,然后查询所有 \(p_{k,i}\) 点上的值之和
    把每个询问差分为成 \([1, l-1]\) 和 \([1, r]\) 两个区间,然后离线下来按右端点排序,维护区间修改单点查询
    树状数组可以做到 \(\mathcal{O}(qT\log M+n\log M)\),当然更快的做法是分块的 \(\mathcal{O}(qT+n\sqrt{M})\)
  • \(|s_k|>T\)
    满足这个条件的 \(k\) 数量是 \(\mathcal{O}(\frac{M}{T})\) 级别的,因此我们考虑对所有的 \(k\) 预处理
    考虑另一种做法,把所有 \(p_{k,i}\) 标上1,然后查询 \(\forall l\le i\le r\),\(end_i\) 子树和之和
    预处理时我们对 \(end_i\) 的子树和做前缀和,询问的差分即可
    \(\mathcal{O}(q+\frac{M}{T}\times n)\)

选择一个合适的 \(T\),我们视 \(n\),\(M\) 和 \(q\) 为同阶,\(T\) 取 \(\sqrt{M}\) 即可
复杂度可以简单地认为是 \(\mathcal{O}(n\sqrt{M})\)

代码 codeforces submission 144319232

标签:le,end,Duff,text,sum,Mad,mathcal,occur,CF587F
来源: https://www.cnblogs.com/gzezfisher/p/cf587f.html

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

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

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

ICode9版权所有