【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)
【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】珠宝商(点分治,后缀自动机)的更多相关文章
- [BZOJ1921] [CTSC2010]珠宝商
Description Input 第一行包含两个整数 N,M,表示城市个数及特征项链的长度. 接下来的N-1 行, 每行两个整数 x,y, 表示城市 x 与城市 y 有直接道路相连.城市由1~N进行 ...
- [CTSC2010]珠宝商 SAM+后缀树+点分治
[CTSC2010]珠宝商 不错的题目 看似无法做,n<=5e4,8s,根号算法? 暴力一: n^2,+SAM上找匹配点的right集合sz,失配了直接退出 暴力二: O(m) 统计过lca=x ...
- [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)
题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...
- 【洛谷4482】Border的四种求法(后缀自动机_线段树合并_链分治)
这题我写了一天后交了一发就过了我好兴奋啊啊啊啊啊啊 题目 洛谷 4482 分析 这题明明可以在线做的,为什么我见到的所有题解都是离线啊 -- 什么时候有机会出一个在线版本坑人. 题目的要求可以转化为求 ...
- CTSC2010 珠宝商
珠宝商 题目描述 Louis.PS 是一名精明的珠宝商,他出售的项链构造独特,很大程度上是因为他的制作方法与众不同.每次 Louis.PS 到达某个国家后,他会选择一条路径去遍历该国的城市.在到达一个 ...
- [模板] 后缀自动机&&后缀树
后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...
- P4218 [CTSC2010]珠宝商
P4218 [CTSC2010]珠宝商 神题... 可以想到点分治,细节不写了... (学了个新姿势,sam可以在前面加字符 但是一次点分治只能做到\(O(m)\),考虑\(\sqrt n\)点分治, ...
- @bzoj - 1921@ [ctsc2010]珠宝商
目录 @description@ @solution@ @accepted code@ @details@ @description@ 简述版题意:给定字符串 S 与一棵树 T,树上每个点有一个字符. ...
- BZOJ 后缀自动机四·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
随机推荐
- Ubuntu18.04 卸载mysql5.7
查看MySQL的依赖项:dpkg --list|grep mysql 要删除上面的这些. 开始卸载: sudo apt-get autoremove --purge mysql-server sudo ...
- idea中导入别人的vue项目并运行
1. 下载node.js 在搭建vue的开发环境之前,先下载node.js,下载地址:https://nodejs.org/en/ https://blog.csdn.net/antma/articl ...
- SpringBoot系列——Filter 过滤器
前言 本文记录一下在SpringBoot项目中是如何使用Filter过滤器 代码.测试 Filter过滤器是servlet包下面的东西,因此我们不需要再额外引包 方法一 直接实现Filter接口,并使 ...
- 使用 Docker 构建 Nebula Graph 源码
Nebula Graph 介绍 Nebula Graph 是开源的高性能分布式图数据库.项目使用 C++ 语言开发,cmake 工具构建.其中两个重要的依赖是 Facebook 的 Thrift RP ...
- 原生js获得八种方式,事件操作
08.17自我总结 关于js 一.原生js获得八种方式 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTa ...
- scrapy常用配置
一.基本配置 1.项目名称 2.爬虫应用路径 SPIDER_MODULES = ['Amazon.spiders'] NEWSPIDER_MODULE = 'Amazon.spiders' 3.客户端 ...
- Java集合专题
1.Java 中常用的容器有哪些? 常见容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表. Collectio ...
- git操作教程
首先就是创建码云(用户名不能是中文),然后新建一个项目(用户名/项目名都不能是中文). 一.在Windows上安装Git 1.从http://msysgit.github.io下载,然后按默认选项安装 ...
- vue之前端鉴权
vue项目前端鉴权方式常用的有以下三种: 1.渲染菜单时控制模块按钮的显示隐藏(不足:直接输入链接仍然可以访问模块) 2.在路由导航守卫中拦截,针对没有权限的模块进行重定向(不足:每次访问模块都需要鉴 ...
- 利用QQ获取ip
首先启动任务管理器,选择性能选型,点击打开资源管理器 点击网络,找到qq.exe 点击下面的TCP链接 最好让你的qq好友发一个离线文件,在接收的时候注意远程连接,即使您所要的你好友的ip地址