【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)\)。


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

【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)的更多相关文章

  1. [BZOJ1921] [CTSC2010]珠宝商

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

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

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

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

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

  4. 【洛谷4482】Border的四种求法(后缀自动机_线段树合并_链分治)

    这题我写了一天后交了一发就过了我好兴奋啊啊啊啊啊啊 题目 洛谷 4482 分析 这题明明可以在线做的,为什么我见到的所有题解都是离线啊 -- 什么时候有机会出一个在线版本坑人. 题目的要求可以转化为求 ...

  5. CTSC2010 珠宝商

    珠宝商 题目描述 Louis.PS 是一名精明的珠宝商,他出售的项链构造独特,很大程度上是因为他的制作方法与众不同.每次 Louis.PS 到达某个国家后,他会选择一条路径去遍历该国的城市.在到达一个 ...

  6. [模板] 后缀自动机&&后缀树

    后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...

  7. P4218 [CTSC2010]珠宝商

    P4218 [CTSC2010]珠宝商 神题... 可以想到点分治,细节不写了... (学了个新姿势,sam可以在前面加字符 但是一次点分治只能做到\(O(m)\),考虑\(\sqrt n\)点分治, ...

  8. @bzoj - 1921@ [ctsc2010]珠宝商

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 简述版题意:给定字符串 S 与一棵树 T,树上每个点有一个字符. ...

  9. BZOJ 后缀自动机四·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...

随机推荐

  1. java调用py文件传参执行

    java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...

  2. YAPI windows 二次开发 树形结构 多层级结构 拖拽 数据导入 接口自动化测试

    什么是YAPI: 高效.易用.功能强大的API管理平台 http://yapi.demo.qunar.com/ github: https://github.com/YMFE/yapi 可以去那里下载 ...

  3. github用户注册和仓库创建

    访问github官网:https://github.com/,点击注册进入注册页面 输入用户名,电子邮箱和密码后点击下一步 邮箱验证,收到github的验证邮箱,打开后点击验证 选择个人计划 创建仓库 ...

  4. 【pat】C++之刷题常用STL容器整理

    1.vector 动态数组,方便的动态扩容,方便的变量初始化(int类型默认初始化为0,bool默认初始化为false),可以用来实现邻接表(结点数太多的图). 头文件 #include<vec ...

  5. 小程序底部tapbar

    app.json "tabBar": { "color": "#ccc", "selectedColor": " ...

  6. WebShell代码分析溯源(二)

    WebShell代码分析溯源(二) 一.一句话变形马样本 <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST ...

  7. ASP.NET Core - 基于IHttpContextAccessor实现系统级别身份标识

    问题引入: 通过[ASP.NET Core[源码分析篇] - 认证]这篇文章中,我们知道当请求通过认证模块时,会给当前的HttpContext赋予当前用户身份标识,我们在需要授权的控制器中打上[Aut ...

  8. Easyui 去除jquery-easui tab页div自带滚动条

    去除jquery-easui tab页div自带滚动条 by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3 需求场景 打开tab页面时,自动载入一个iframe页 ...

  9. Locust压测结果准确性验证

    最近闲着没事做,就重新研究了一下基于python语言的Locust性能测试框架 发现在压测的过程中,虽然设置了100并发,但是通过实际监控,完全看不到100并发压测的效果 通过代码AOP日志监控接口的 ...

  10. 10分钟浅谈CSRF突破原理,Web安全的第一防线!

    CSRF攻击即跨站请求伪造(跨站点请求伪造),是一种对网站的恶意利用,听起来似乎与XSS跨站脚本攻击有点相似,但实际上彼此相差很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户 ...