XSY3320

前置芝士:回文前缀&&borderborderborder
推荐博客
推荐博客

考虑点分治,问题变成求经过重心的回文路径个数。
一条经过重心的回文路径长这样:

xxx到zzz的串与yyy到rootrootroot的串相同。

建出根到每个节点对应的串的AC自动机,并在failfailfail树上找出每个串的回文前缀。判断根到某个节点对应的串是不是回文串可以用哈希解决。

根据borderborderborder理论,一个回文串的所有回文前缀的长度可以组成一个不超过O(logn)O(logn)O(logn)项的等差数列。即若TkT_kTk​是回文串,TkT_kTk​的最长回文真前缀是Tk−1T_{k-1}Tk−1​,Tk−1T_{k-1}Tk−1​的最长回文真前缀是Tk−2T_{k-2}Tk−2​,…,T2T_2T2​的最长回文真前缀是T1T_1T1​,那么有∣Ti∣=∣Ti−1∣+d|T_i|=|T_{i-1}|+d∣Ti​∣=∣Ti−1​∣+d(ddd为公差)。

考虑一个点作为xxx的贡献。设根到xxx对应的串为UUU,UUU在AC自动机上对应点XXX。把UUU的最长回文真前缀看成TkT_kTk​,那么TiT_iTi​作为回文串TTT时,我们要查询有多少个点yyy,满足根到yyy对应的串是UUU的后缀,且长度为∣U∣−∣Ti∣=∣U∣−∣T1∣−(i−1)d|U|-|T_i|=|U|-|T_1|-(i-1)d∣U∣−∣Ti​∣=∣U∣−∣T1​∣−(i−1)d,记有num[i]num[i]num[i]个符合条件的yyy。那么最后这个xxx的贡献就是∑i=1knum[i]\sum_{i=1}^{k}num[i]∑i=1k​num[i],换句话说,我们要求有多少个点yyy,满足根到yyy对应的串是UUU的后缀,且长度lenlenlen符合:len≡∣U∣−∣T1∣(modd),∣U−T1∣≤len≤∣U∣−∣Tk∣len\equiv|U|-|T_1|(\mod d),|U-T_1|\leq len\leq |U|-|T_k|len≡∣U∣−∣T1​∣(modd),∣U−T1​∣≤len≤∣U∣−∣Tk​∣。

UUU的后缀,即XXX在failfailfail树上的祖先对应的串。我们对failfailfail树dfsdfsdfs,同时开一个数组ci,jc_{i,j}ci,j​ 记录当前节点有多少个祖先(包括自己),满足该祖先代表的串的长度 modi=j\mod i=jmodi=j。

那么最终贡献就是dfsdfsdfs到的点代表的串长为∣U∣−∣Tk∣|U|-|T_k|∣U∣−∣Tk​∣时cd,(∣U∣−∣T1∣)moddc_{d,(|U|-|T_1|)\mod d}cd,(∣U∣−∣T1​∣)modd​的值 减去 dfsdfsdfs到的点代表的串长为∣U∣−∣T1∣−d|U|-|T_1|-d∣U∣−∣T1​∣−d时cd,(∣U∣−∣T1∣)moddc_{d,(|U|-|T_1|)\mod d}cd,(∣U∣−∣T1​∣)modd​的值。

但这样空间复杂度是O(n2)O(n^2)O(n2)的,所以我们考虑分块,只开到c[n][n]c[\sqrt{n}][\sqrt{n}]c[n​][n​]的大小,对于公差大于n\sqrt{n}n​的,我们暴力跳failfailfail寻找答案。

[XSY3320] string (AC自动机,哈希,点分治)相关推荐

  1. ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)

    题目链接:点击查看 题目大意:给出一个匹配串 str ,再给出 n 个长度不大于 6 的匹配串 s ,问每个匹配串出现的次数,分可以重复或不可以重复两种情况 题目分析:因为是匹配串在模式串中出现的次数 ...

  2. hdu 6086 Rikka with String(AC自动机+状压dp)

    题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...

  3. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  4. zoj-3228 Searching the String AC自动机

    用一个val数组记录每一个单词结尾对应的位置,pos数组记录某个节点的深度(其实就是记录单词的长度的),然后用一个op数组记录一下每一个单词对应的询问方式,主要是查询分为了可重叠和不可重叠,不可重叠的 ...

  5. A. chino with string(ac自动机+floyd矩阵快速幂)

    LINK 有mmm个字符串,每个字符串有一定的分值(可能为负数) 求出一个长nnn的字符串sss使得它的价值最大,你只需要输出这个最大的价值. 价值定义为∑i=1mcii∗pointi\sum\lim ...

  6. 【LOJ6681】yww 与树上的回文串(点分治)(AC自动机)(字符串哈希)(回文串broder理论)

    传送门 社论(题解): 首先长剖重剖都考虑过了,并没有办法支持快速合并,边分更不用说了,权值在边上怎么边分怎么蛋疼. 考虑点分,我们知道如果一个回文串过了重心,他要么就是重心延伸出去的回文前缀,要么它 ...

  7. [CF587F]Duff is Mad[AC自动机+根号分治+分块]

    题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...

  8. CodeForces - 1252D Find String in a Grid(AC自动机)

    题目链接:点击查看 题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a 个单位,再向下 ...

  9. 【CF917E】Upside Down(哈希二分)(后缀数组)(AC自动机)

    传送门 诈尸,主要是最近一直在刷水题感觉没有什么值得写的. 口胡好题,不建议写. 题解: 一句话说,将出现的情况分为在 u-LCA链上 和横跨LCA 分别统计. 在链上的可以直接建立正反AC自动机,然 ...

最新文章

  1. 使用ASP.NET上传图片汇总
  2. 图像处理 --- 一、认识图像处理
  3. 简述局域网与分布式系统异同点
  4. 人工智能相关领域的国际顶尖会议介绍
  5. Asp.Net自学笔记...(运算符)
  6. 暑假周进度总结报告2
  7. 你知道IT行业里哪种岗位女生最多吗?
  8. [Luogu 2090]数字对
  9. 数据结构与算法:十大排序算法之冒泡排序
  10. 10个你必须知道的jQueryMobile代码片段
  11. 23.docker export
  12. linux 字幕制作工具,Arctime for Linux免费字幕软件
  13. 解决: error: Class declaration lacks Q_OBJECT macro. 的报错
  14. SYN报文什么时候会被丢弃?
  15. 腾讯云部署node mysql_【腾讯云】配置安装node
  16. 回给collapsar的信
  17. FPGA和USB3.0通信-UVC摄像机
  18. MATLAB绘制图中图
  19. Luogu P2129 小Z的情书
  20. 字符串和字符串标准库

热门文章

  1. 经纬度 c代码中定义_如何将TXT文本格式的批量经纬度值导入到奥维成为标签
  2. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
  3. [mybatis]Configuration XML_databaseidProvider
  4. 求旋转数组的最小数字C++
  5. Problem G. Pandaria(线段树合并 + Kruskal 重构树)
  6. 多项式牛顿迭代(应用:求逆,开根,对数exp)
  7. HDU 3590 PP and QQ(反nim博弈,删边游戏)
  8. 追债之旅(Dijkstra最短路)
  9. P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp
  10. Pool construction UVA - 1515 最小割模型