惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LangChain Blog
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements

博客园 - nealchen

无需 Path Measure,也能轻松推出 Diffusion ELBO 🌊 LangFlow: 连续扩散语言模型,首次匹敌离散 CTMC ELBO 的另一个证明 【Remix】拆解 DDIM 论文【扩散模型加速采样】 CCSP2021游记 二元多项式求逆中的小坑 NOI2020乱搞记 Ubuntu 20.04 工作区小记 2020省选犯傻记 AtCoder tokiomarine2020 题解 [CF1336E]Chiori and Doll Picking [JOISC2020]遗迹 积性函数求和:构造狄利克雷卷积将值域限定于powerful number [UR19B]通用测评号 另解 积性函数求和:筛法DP、洲阁筛、Min_25筛 最大权完美匹配:KM算法的优化 代数余子式和伴随矩阵 生成树计数:矩阵树定理 [AGC024F]Simple Subsequence Problem 区间最值问题(RMQ):压位分块稀疏表
[ZJOI2020]字符串
nealchen · 2020-07-11 · via 博客园 - nealchen

题目链接

以下字符串采用Python记法。

题意

定义平方串形如 $PP$, 给定母串 $S$, 要求回答 $q$ 组询问,每组询问形如 $S[l:r]$ 有多少个本质不同平方子串。

数据范围:$|S|,  q \le 2\times10^5$.

题解

这里run的记法是 $(i, j, p)$ 表示 $S[i:j]$ 的最小周期为 $p$, 且该性质不可向左右扩展。

任意一个平方子串 $S[i:j]$ 必然含于恰好一个run $(i_r, j_r, p)$ 使得 $2p \mid j-i, i_r \le i<j \le j_r$.

先求出所有run. 一个run $(i, j, p)$ 的平方子串形如 $S[u:u+2kp]$, 其中 $k \in \mathbb N^*$, $i \le u<u+2kp \le j$.

考虑其上一次出现为 $S[v:v+2kp]$, 那么对于 $r \ge u+2kp$ 且 $v<l \le u$ 的询问 $(l, r)$ 其贡献 $1$ 的答案。把它拆成前缀相减的形式,即对 $r \ge u+2kp, l \le u$ 的询问 $(l, r)$ 贡献 $1$ 的答案,并对 $r \ge u+2kp, l \le u$ 的询问 $(l, r)$ 贡献 $-1$ 的答案。

考虑把这个过程画到坐标上。那么也就是,一组如此的 $(i, j, p, u, k)$ 将在 $(u, u+2kp)$ 上放置权值 $+1$, 在 $(v, u+2kp)$ 上放置权值 $-1$, 每次询问 $(l, r)$ 即询问 $\begin{cases}x \ge l\\y \le r\end{cases}$ 区域内的所有点权值和。

我们注意到,对于 $u \ge i+p$, 均有 $v=u-p$, 否则 $v<i$. 我们首先特殊处理这些 $i \le u<i+p$ 的串带来的 $-1$ 权值。每个如此的 $(i, j, p, k, u)$ 都与本原平方串 $S[u+2(k-1)p:u+2kp]$ 对应,不同的该五元组对应的本原平方串不同,所以总数为 $O(n\log n)$ 级别。$v$ 可以用哈希表查询。把询问按照 $r$ 离线,分块维护,所以这部分时间复杂度 $O(n\log n+q \sqrt n)$, 空间复杂度 $O(n\log n)$.

我们接下来还需要考虑点 $(u, u+2kp)$ 及点 $(u-p, u+2kp)$.

注意到枚举 $(i, j, p, k)$ 为 $O(n)$ 级别。对于一个Run和枚举的 $k$, 我们发现两类权值的贡献上,放置的点都形如 $(x, x+b)$ ($L \le x \le R$) 的形式。问题转化为:有一些斜线 $(L, R, b, v)$ 表示对于所有 $x \in [l, r], y=x+b$ 的 $(x, y)$ 都放置 $v$ 的权值,求 $\begin{cases}x \ge l\\y \le r\end{cases}$ 这块区域的权值和。

下图是查询 $ababababa$ 中 $[1:8]$ 区间的情况。黑斜线表示 $+1$, 红斜线表示 $-1$. (画图工具:GeoGebra)

把它拆成两个区域 $\begin{cases}b \le r-l\\y \le r\end{cases}$ 和 $\begin{cases}b \le r-l\\x<l\end{cases}$ 内权值和的差,按照 $r-l$ 离线,对 $x, y$ 各自区间修改、区间查询,仍然分块,时间复杂度 $O((n+q)\sqrt n)$.

下图直观地展示了如此拆分的意义。

综上所述,本题在 $O((n+q)\sqrt n)$ 时间、$O(n\log n+q)$ 空间内得到解决。如果把分块全部换成线段树,时间复杂度是 $O(n\log^2 n+q \log n)$.

代码链接