SOJ1737 题解
题意
给定一个长度为 \(n\) 的串 \(S\)。
定义 \(occ(T)\) 表示串 \(T\) 在 \(S\) 中出现的次数。
\(q\) 次询问,每次询问给定一个区间 \([l,r]\),查询 \(S[l,r]\) 的所有子串的 \(occ\) 之和。
\(1\le n,q\le 2\times 10^5\)
题解
学到了新技能,来记一下。
这是一道看起来很典的题目。但实际上并不好做。
先思考 \(n^2\) 做法(也是我的做法)。可以想到一种转化,即求 \(\sum\limits_{i=1}^n\sum\limits_{j=l}^r\operatorname{lcp}(S[i,n],S[j,r])\)。离线后可以做到 \(O(n^2)\)。但这种做法已无法优化。
换一种,定义 \(f(T)\) 为 \(T\) 的所有后缀的 \(occ\) 之和。建出后缀树,则若我们知道 \(T\) 在 \(\text{sam}\) 的节点,可以 \(O(1)\) 求。此时原式等价于 \(\sum\limits_{i=l}^rf(S[l,i])\)。因为 \(S[l,l],S[l,l+1],\dots,S[l,r]\) 在 \(\texttt{sam}\) 上是一条链,所以这种做法是 \(O(n^2)\) 的。
“链”的性质为接下来的优化创造条件。这里引进一种新科技:\(\text{DAG}\) 链剖分。我们想要这样的性质:\(\text{DAG}\) 上任意一条路径经过 \(O(\log P)\) 条链,其中 \(P\) 为路径总量,在 \(\text{sam}\) 上是 \(n^2\)。建链的方法如下:
- 对所有节点,求以 \(i\) 为起点的路径数量 \(f_i\) 和以 \(i\) 为终点的路径数量 \(g_i\)。
- 令 \(nxt_i\) 为所有 \(i\) 出点中 \(f\) 最大的点,\(pre_i\) 为所有 \(i\) 入点中 \(g\) 最大的点。
- 若边 \((u,v)\) 满足 \(nxt_u=v\wedge pre_v=u\),则其为重边。否则为轻边。
- 此时只保留所有重边,即可完成链剖。
证明一下上面的性质。若走一条轻边,必有 \(2f_v<f_u\vee g_v>2g_u\)。于是得证。
对于建链,另一种解释是:先由 \(nxt\) 建树,再由 \(pre\) 树剖。这样可以更直观地感受 \(\text{DAG}\) 链剖的妙处。
建出链后,利用前缀和进行优化,二分哈希找到何时跳出链。复杂度 \(O(n\log^2n)\)。
SOJ1737 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- echarts柱状图渐变色并且显示数据及柱状图的宽度调整
series: [{ type: 'bar', name: '起飞', barWidth: '20px', //柱状图的宽度 itemStyle: { normal: { //显示渐变色颜色 colo ...
- Vue element 自定义表单验证(验证手机号)
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" ...
- RabbitMQ、RocketMQ、Kafka延迟队列实现
延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单. 那么,今天我们需 ...
- 为什么 java 容器推荐使用 ExitOnOutOfMemoryError 而非 HeapDumpOnOutOfMemoryError ?
前言 好久没写文章了, 今天之所以突然心血来潮, 是因为昨天出现了这样一个情况: 我们公司的某个手机APP后端的用户(customer)微服务出现内存泄露, 导致OutOfMemoryError, 但 ...
- MongoDB6.0的安装「2023年」
你好,我是悦创. 优质原文格式:https://bornforthis.cn/column/crawler/supplement/mongodb-install.html 点进去有惊喜. 吐槽,这篇博 ...
- [数据结构]KMP算法(含next数组详解)
字符串匹配问题 给定一个字符串 s 和一个要匹配的模式串 p.模式串 p 有可能在 s 中多次出现,请求出模式串 p 在 s 中所有出现的起始位置. 暴力匹配算法 BF 算法思路 在面对字符串匹配问题 ...
- Java后台如何接收与处理JSON类型数据
项目开发中偶尔会使用到某个为JSON类型的字段,一个字段中又包含多个其他的字段. 这种设计方式是根据实际需要来进行处理的,比如规则可能包含多条,每一条规则又包含 多个字段:再比如一些特殊的应用场景如标 ...
- 练习_请使用日期时间相关的API
练习_请使用日期时间相关的API 练习:请使用日期时间相关的APi,计算出一个人已经出生了多少天.分析:1.使用scanner类中的方法next,获取出生日期2.使用DateFormat类中的方法pa ...
- Unity - 自定义Log
嗨,崽崽们大家好.实在是不知道写个啥了,最近总是恍惚,今儿偷个懒吧,给大家推荐一个小黑自己写的小型日志工具,在一些小项目中管够使用了. 那有人会问了,Unity不是自带日志么,为什么还要自己做个小工具 ...
- python正则查找
a = "#1+#5+#8+#10+#11+#12+#13+#14+#15-#22-#23-#24-#25-#26-#27-#28" b = re.findall("#\ ...