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. 仿照redis写的nginx开机画面
  2. IOS - No provisioning profiles with a valid signing identity 一种解决方法
  3. c# 单例 按需创建
  4. Oracle中查看最近被修改过的表的方法
  5. 前台获取json未定义问题之两种常用解决办法
  6. 从新手到Flutter架构师,一篇就够!帮你突破瓶颈
  7. Handler post用法整理
  8. 一、详细Python3.8+PyQt5+pyqt5-tools+Pycharm配置
  9. MONO,原来你是水中月
  10. Oracle 21C 新特性:数据泵相关新特性汇总
  11. 聪明人自动焊锡机器人_自动焊锡机的基本焊锡原理
  12. solaris 10 虚拟机下安装双机
  13. UE4场景流程规范-纹理压缩(美术版/程序版/太长不看版)
  14. linux下格式化SD卡
  15. 红亚太学链微信公众号正式发布
  16. 【转载】游戏场景设计、构图的一些基本思考
  17. 堪比巨著:饿了么交易系统5年演化血泪史
  18. 【kafka异常】使用Spring-kafka遇到的坑
  19. linux 的gz命令详解,linux tar.gz压缩解压命令详解
  20. 认认真真推荐 10 个优质自学平台

热门文章

  1. baseresponse响应类_Java response响应体和文件下载实现原理
  2. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站
  3. 山西农业大学计算机科学与技术分数线,2016年山西农业大学计算机科学与技术专业在湖北录取分数线...
  4. 宝塔mysql远程链接_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案
  5. 8-1 回溯法实验报告 (15 分)(思路+详解)
  6. 7-47 打印选课学生名单 (25 分)(两种做法)(思路加详解+map+vector做法+最后一个点超时解决)+兄弟们冲丫丫
  7. LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数
  8. 数据结构与算法--二叉树实现原理
  9. 华为任职资格_看了华为的任职资格体系,你就明白员工为啥这么拼?
  10. cg word List5