题意

给定一个长度为 \(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 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. .Net引用根目录子文件夹下的dll文件

    在.Net开发的时候,有时候会引用一套库,这些库是由多个dll文件.正常情况下,这些dll文件需要拷贝到运行根目录下.如果这些dll文件比较多,加上其他直接引用的dll,这样会导致根目录下非常乱.我们 ...

  2. [python] 基于wordcloud库绘制词云图

    词云Wordcloud是文本数据的一种可视化表示方式.它通过设置不同的字体大小或颜色来表现每个术语的重要性.词云在社交媒体中被广泛使用,因为它能够让读者快速感知最突出的术语.然而,词云的输出结果没有统 ...

  3. 企业应用架构研究系列二十五:IdentityServer4 认证服务搭建

    IdentityServer4 更新了开源协议,曾经想替换它,不在使用IdentityServer4 ,但是后来,研究来研究去,发现IdentityServer4 的功能实在是强大,设计体系完整,随着 ...

  4. CF1744B Even-Odd Increments

    简要题意 \(T\) 组数据,每组数据给定一个长度为 \(n\) 的数列,有 \(q\) 次操作,共有两种操作: \(\texttt{0 x}\),给数列中所有偶数加上 \(x\): \(\textt ...

  5. 个别编程语言在OJ平台上的输入输出方式

    OJ 平台输入输出 一. C/ C++ 输入 scanf() gets() getchar() 输出 printf() puts() putchar() C++ cin >> cout & ...

  6. final关键字用于修饰类-final关键字用于修饰成员方法

    final关键字与四种用法 概念 学习了继承后,我们知道,子类可以在父类的基础上改写父类内容容,比如,方法重写.那么我们能不能随意的继承 API中提供的类,改写其内容呢?显然这是不合适的.为了避免这种 ...

  7. T02 ExtractSubject 项目开发总结

    公纵号: 皮豪 博客:www.kbug.cn 邮箱:pphboy@qq.com 前言 看来已经是一种习惯,每次寒假都会开发一个项目出来.本次项目使用的是Qt GUI,语言是C++.不得不说,在业务上写 ...

  8. Spring02---IOC-Debug查看Bean的实例化过程

    1 简介 springIOC它是对bean进行管理. 我们通常可以通过xml.properties.yml.注解等来配置bean的信息 spring读取这些配置信息,解析,生成BeanDefiniti ...

  9. imax6开发版_交叉编译

    下载 arm-linux-gnueabihf-gcc编译器 sudo apt install gcc-arm-linux-gnueabihf #安装完成后使用如下命令查看版本 arm-linux-gn ...

  10. DVWA靶场实战(十四)——JavaScript

    DVWA靶场实战(十四) 五.Java Script: 1.漏洞原理: 这里的JavaScript其实是JavaScript Attack也就是JS攻击.JavaScript是一种基于对象和事件驱动的 ...