[XSY3320] string (AC自动机,哈希,点分治)
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=1knum[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自动机,哈希,点分治)相关推荐
- ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)
题目链接:点击查看 题目大意:给出一个匹配串 str ,再给出 n 个长度不大于 6 的匹配串 s ,问每个匹配串出现的次数,分可以重复或不可以重复两种情况 题目分析:因为是匹配串在模式串中出现的次数 ...
- 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|] ,长度 ...
- hdu 6086 -- Rikka with String(AC自动机 + 状压DP)
题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...
- zoj-3228 Searching the String AC自动机
用一个val数组记录每一个单词结尾对应的位置,pos数组记录某个节点的深度(其实就是记录单词的长度的),然后用一个op数组记录一下每一个单词对应的询问方式,主要是查询分为了可重叠和不可重叠,不可重叠的 ...
- A. chino with string(ac自动机+floyd矩阵快速幂)
LINK 有mmm个字符串,每个字符串有一定的分值(可能为负数) 求出一个长nnn的字符串sss使得它的价值最大,你只需要输出这个最大的价值. 价值定义为∑i=1mcii∗pointi\sum\lim ...
- 【LOJ6681】yww 与树上的回文串(点分治)(AC自动机)(字符串哈希)(回文串broder理论)
传送门 社论(题解): 首先长剖重剖都考虑过了,并没有办法支持快速合并,边分更不用说了,权值在边上怎么边分怎么蛋疼. 考虑点分,我们知道如果一个回文串过了重心,他要么就是重心延伸出去的回文前缀,要么它 ...
- [CF587F]Duff is Mad[AC自动机+根号分治+分块]
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...
- CodeForces - 1252D Find String in a Grid(AC自动机)
题目链接:点击查看 题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a 个单位,再向下 ...
- 【CF917E】Upside Down(哈希二分)(后缀数组)(AC自动机)
传送门 诈尸,主要是最近一直在刷水题感觉没有什么值得写的. 口胡好题,不建议写. 题解: 一句话说,将出现的情况分为在 u-LCA链上 和横跨LCA 分别统计. 在链上的可以直接建立正反AC自动机,然 ...
最新文章
- 使用ASP.NET上传图片汇总
- 图像处理 --- 一、认识图像处理
- 简述局域网与分布式系统异同点
- 人工智能相关领域的国际顶尖会议介绍
- Asp.Net自学笔记...(运算符)
- 暑假周进度总结报告2
- 你知道IT行业里哪种岗位女生最多吗?
- [Luogu 2090]数字对
- 数据结构与算法:十大排序算法之冒泡排序
- 10个你必须知道的jQueryMobile代码片段
- 23.docker export
- linux 字幕制作工具,Arctime for Linux免费字幕软件
- 解决: error: Class declaration lacks Q_OBJECT macro. 的报错
- SYN报文什么时候会被丢弃?
- 腾讯云部署node mysql_【腾讯云】配置安装node
- 回给collapsar的信
- FPGA和USB3.0通信-UVC摄像机
- MATLAB绘制图中图
- Luogu P2129 小Z的情书
- 字符串和字符串标准库
热门文章
- 经纬度 c代码中定义_如何将TXT文本格式的批量经纬度值导入到奥维成为标签
- 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
- [mybatis]Configuration XML_databaseidProvider
- 求旋转数组的最小数字C++
- Problem G. Pandaria(线段树合并 + Kruskal 重构树)
- 多项式牛顿迭代(应用:求逆,开根,对数exp)
- HDU 3590 PP and QQ(反nim博弈,删边游戏)
- 追债之旅(Dijkstra最短路)
- P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp
- Pool construction UVA - 1515 最小割模型