【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)

题面

洛谷
BZOJ权限题

题解

如果要我们做暴力,显然可以以某个点为根节点,然后把子树\(dfs\)一遍,建出特征串的\(SAM\),就可以直接计算出现次数了。复杂度是\(O(size^2)\)
另外一种暴力是我们枚举以某个点为中心,考虑在其两棵不同子树内各选择一条链,然后拼接在一起计算答案。我们假设选择了\(R\)为中心,然后有一条\((u\rightarrow R)\)的链,有一条\((R\rightarrow v)\)的链,我们把\((u\rightarrow R)\)这个串在每个匹配到的结尾位置打上一个标记,把\((R\rightarrow v)\)这个串在每个被匹配到的开头位置打上一个标记,于是我们就只需要把每个位置的左右两个标记乘起来就是答案了。
然后考虑怎么打这个标记,对于在开头位置打标记,显然是匹配上了一个后缀的前缀,那么我们把后缀树建出来,因为每一个后缀上的一个叶子节点对应着一个后缀,这样子我们只要在后缀树上找到这个串匹配的节点,然后其子树的所有叶子节点对应的后缀的开头位置都要\(+1\),于是子树加可以变成在后缀树上的匹配点单点加,最后一次\(dfs\)一次后缀树就好了。类似的,在结尾位置打标记就是在前缀的一段后缀打标记,那么建出前缀树就行了。于是我们就可以做到\(O(m+size)\),其中\(m\)是特征串的长度。但是这样子会出现\(R\)的相同子树里的一个从上往下的串和一个从下往上的串进行了匹配,于是我们还要对于每一个子树进行去除。
现在有了这两种复杂度不同的做法,显然我们可以按照\(B=\sqrt m\)来分类讨论,对于\(size\le B\)直接\(O(size^2)\)暴力,否则对应下面这种的\(O(m+size)\)的做法,注意对于容斥减去相同子树内的贡献的时候,也需要考虑使用两种对应的方法,否则复杂度是假的。
upd:
补一下关于复杂度的证明:
对于第一类暴力,单次是\(O(size^2)\)的,因为这样处理完之后所有子树的答案已经贡献完毕,可以直接返回,所以只需要在分治子树大小第一次小于\(B\)的时候统计答案,然后因为所有这样的子树两两不交,所以\(\sum size\)是不会超过\(n\)的,而\(\sum size^2\le \frac{n}{B}B^2=nB\),所以这一部分的复杂度是\(O(nB)\)的。
对于第二类暴力,我们考虑\(size\gt B\)的分治重心的个数,根据点分治的性质,没有子树的\(size\)会大于父亲的一半,所以每次向上至少要合并两个\(size\gt B\)的分治子树,而这样子的子树不会超过$ \frac{n}{B}\(个,所以向上合并的次数不会超过\)\frac{n}{B}$次,所以这样子的分治重心的个数不会超过\(2\frac{n}{B}\),而这样子单次复杂度是\(O(size+m)\),所以这部分的总复杂度是\(O(\frac{n}{B}m)\)。
综上\(\frac{n}{B}m=nB\),即\(B=\sqrt m\)的时候复杂度最优,为\(O((n+m)\sqrt m)\)。


代码被我咕咕咕了怎么办......

转载于:https://www.cnblogs.com/cjyyb/p/11151057.html

【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)相关推荐

  1. [BZOJ1921] [CTSC2010]珠宝商

    Description Input 第一行包含两个整数 N,M,表示城市个数及特征项链的长度. 接下来的N-1 行, 每行两个整数 x,y, 表示城市 x 与城市 y 有直接道路相连.城市由1~N进行 ...

  2. [CTSC2010]珠宝商(点分治+根号分治+后缀自动机)

    [CTSC2010]珠宝商 洛谷题目传送门 简要题意 给定一颗nnn个节点的树,和一个长度为mmm的模式串SSS 树上每个节点都有一个字符 求树上所有路径的点的字符拼成的字符串在SSS中的出现次数之和 ...

  3. BZOJ 1921: [Ctsc2010]珠宝商 点分治套SAM

    题目链接 首先可以发现两种算法 一. 暴力处理 对"特征串"建SAM 枚举路径的一个端点,\(dfs\)另一个端点,同时维护在SAM上的位置. 每到一个位置会有SAM上对应节点的r ...

  4. bzoj1921 [CTSC2010]珠宝商 SAM+后缀树+点分治

    Description 有一棵n个节点的树和一个长度为m的字符串S,树上每个节点有一个字符.问对于任意的有序数对(x,y),从x到y路径组成的字符串在S中出现次数的和. n,m≤5⋅104n,m\le ...

  5. BZOJ1921: [Ctsc2010]珠宝商(点分治+SAM)

    传送门 题解: 点分治,如果点数≥n\ge \sqrt{n}≥n​,则结合后缀树O(sze+m)O(sze+m)O(sze+m)处理出每个位置的开始,结束点并统计答案.否则从每个点开始暴力扩展路径. ...

  6. bzoj1921: [Ctsc2010]珠宝商

    暴毙选手又被zo老师D费了 暴力是n^2的都会 有另一个点分的做法,就是看成两条链,然后在后缀树上跑,找到对应原串位置拼起来,是n*(logn+m) 然后就根号分治,树的大小超过阈值就点分,小于就暴力 ...

  7. bzoj 1921: [Ctsc2010]珠宝商 后缀自动机+点分治

    题意 有一棵n个节点的树和一个长度为m的字符串S,树上每个节点有一个字符.问对于任意的有序数对(x,y),从x到y路径组成的字符串在S中出现次数的和. n,m<=50000n,m<=500 ...

  8. [CTSC2010]珠宝商 SAM+后缀树+点分治

    [CTSC2010]珠宝商 不错的题目 看似无法做,n<=5e4,8s,根号算法? 暴力一: n^2,+SAM上找匹配点的right集合sz,失配了直接退出 暴力二: O(m) 统计过lca=x ...

  9. [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)

    题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...

最新文章

  1. Windows Phone 7 WebBrowser 中文乱码问题
  2. 最新:2021年度U.S.News美国大学排名发布,哈佛不是第一!
  3. LeetCode 685. 冗余连接 II
  4. 【Linux】一步一步学Linux——dpkg-preconfigure命令(275)
  5. PhantomJS 一个隐形的浏览器
  6. 软件工程网络15个人阅读作业1(201521123029 郑佳明)
  7. 荒岛余生最后一个包裹_从《荒岛余生》看上世纪九十年代美国社会主流价值观...
  8. 135. 分发糖果(JavaScript)
  9. 图的广度优先搜索算法
  10. 节奏大师闪退android,游戏动态:《节奏大师》闪退问题解决方法汇总
  11. YOLOV3训练环境的搭建
  12. python实现整数反转_python算法 整数反转
  13. 网络翻译-利用有道接口
  14. 延时加载(lazy load)
  15. 全国计算机等级考试二级教程——Python语言程序设计(2018年版)习题代码:第2章
  16. tpshop index.php,第三讲、TPshop linux安装
  17. 怎样把软件从计算机移到桌面上,怎么样才能将旧电脑的重要软件移动到新电脑上?...
  18. 【Python】批量修改照片日期和文件名
  19. JAVA中如何创建一个文件
  20. 加密解密工具 之 波利比奥斯方阵密码

热门文章

  1. 汽车一键启动 汽车手机远程启动系统  汽车无钥匙进入 手机APP控车智能防盗
  2. 470万条12306用户信息遭泄露
  3. Amcharts 入门教程
  4. 神经网络程序设计课学习心得
  5. linux(x64)下安装Matlab 2015b破解版(含安装包)
  6. java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...
  7. Facebook语音识别野心曝光,测试Aloha,挑战苹果Siri
  8. 数据结构--AVL树(全)
  9. VIF,共线相关性理解
  10. PyQT5打包后报错:Could not find QtWebEngineProcess.exe