Runs 小记

news/2024/11/14 8:38:21/文章来源:https://www.cnblogs.com/yyyyxh/p/18542492/runs

来一点不严谨、不详细的备忘性质的速通学习笔记。不放证明了,证明大家可以去洛谷题解区看我稍微看了一眼,然后忘了

首先什么是 Runs?我的理解是它就是一个压缩了所有本质不同的平方串的结构。对于一个字符串 \(S\),定义它的一个 Runs 是满足如下条件的三元组 \((l,r,p)\)

  • \(S[l,r]\) 的最小周期为 \(p\)

  • \(2p \le r - l + 1\)

  • 该结构不能继续向左向右扩展。即 \(S_{l-1}\ne S_{l + p - 1},S_{r + 1}\ne S_{r - p + 1}\)。(这里认为边界填充了一个不在字符集中的极小值)

Runs 和平方串之间的关系:显然每个 Runs 的长度为 \(2p\) 的倍数的子串一定是一个平方串,反过来也很容易得到任何一个平方串一定至少位于一个 Runs 中,因为一个平方串就是一个未经扩展的 Runs。

一个更强的性质是,一个平方串可以用上述方式唯一被一个 Runs 统计到。证明的大致思想大概是你考虑一个互相包含的 Runs,大的 Runs 的最小周期必须严格大于小的 Runs 的最小周期。而我们可以证明,对于一个 Runs 的所有长度至少为 \(2p\) 的子串,其最小周期一定为 \(p\)。所以一个最小周期为 \(p\) 的平方串(长度 \(2kp\)),其只会被最小周期恰好为 \(p\) 的 Runs 统计恰好一次。

如何求出 Runs?一个非常简单的想法是考虑在《优秀的拆分》中运用到的调和级数分块。我们枚举当前 Runs 的周期 \(p\),然后每隔 \(p\) 个点扔一个关键点。接下来枚举相邻的两个关键点,钦定每一个 Runs 在它的区间中前两个关键点统计到。那么从这两个关键点往前做 \(\operatorname{lcs}\) 匹配,往后做 \(\operatorname{lcp}\) 匹配,如果总匹配长度 \(\ge 2p\) 且往前做的 \(\operatorname{lcs}\) 没有包含上一个关键点,就找到了一个不一定满足第一个条件的准 Runs。

对于一个 Runs \((l,r,p)\),其可能在 \(2p,3p\dots\) 处多次统计,那么对于所有你求出来的准 Runs 中,\((l,r)\) 相同的取 \(p\) 最小的哪些就是真正的 Runs 了,复杂度可以用计数排序去重做到严格 \(O(n\log n)\)

一般来说,让你写平方串的题目,写调和级数分块已经足够解决问题了。

既然已经有了调和级数分块,我们为什么还需要 Runs 这个结构呢?一大原因是,对于刻画所有平方串组成的集合的性质的题目,我们想要更低的复杂度。

Runs 的一个关键性质是,对于一个串,至多有 \(2n\) 种 Runs。我们可以通过一种构造 Runs 算法来说明这个性质:

我们考虑减少调和级数分块做法中,我们需要枚举的关键点对数量。对于一个 Runs,其所有长度为 \(p\) 的子串是同一个串的不同循环移位,我们找出其中的最小表示法 \(S[k,k+p-1]\)

可以证明的一个关键性质:\(S[k,k+p-1]\) 不存在任何 Border。

这带来两个非常好的推论:一个是 \(S[k,k+p-1]\) 是一个 Lyndon 串;另一个是,如果钦定 \(k\le l+p-1\),该最小表示法的位置是唯一的,后文的算法钦定在此最小表示法的位置处统计该 Runs。

那么这意味着,字符串以 \(k\) 开始的后缀 \(S[k,n]\) 严格小于所有 \(t\in [k+1,k+p-1]\) 的后缀 \(S[t,n]\)

我们先求出每个后缀在后缀数组中的排名 \(rk\),然后对于每一个 \(i\),找到其之后第一个在 \(rk_i>rk_j\) 位置 \(j\)。将 \(i,j\) 作为关键点对扩展出一个 Runs。(这里为了不重复统计同一个 Runs,同样可以钦定我们统计的一定是该 Runs 中出现的第一个循环最小表示法;当然也可以事后去重)。

这样扩展出的 Runs 一定满足性质:\(rk_k > rk_{k+p}\),通过 Runs 的周期性质可以发现这个条件等价于 \(S_{r-p+1}>S_{r+1}\)

那么那种 \(S_{r-p+1}<S_{r+1}\) 的 Runs 该怎么统计呢?对于上述的所有讨论,我们人为逆转字符集的大小关系(包括字符串末尾填充的空字符,从极小值逆转成极大值),相当于 reverse 了一下后缀数组,然后按照刚才的方法再次找出 \(O(n)\) 对关键点对扩展。

由于上述讨论,我们就证明了 Runs 的个数不超过 \(2n\),且给出了一种更加清新的 Runs 构造方法。如果使用 SA-IS + \(O(n)-O(1)\) RMQ 算法实现以上过程,可以把复杂度降低到 \(O(n)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832443.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka怎么配置SASL用户名密码认证

服务端配置(server.properties):# 开启SASL认证 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN# 配置JAAS文件路径 listeners=SASL_PLAINTEXT://localhost:9092 sasl.enabled.mechanisms=PLAIN listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafk…

数据采集与融合技术第四次实践作业

gitee链接: https://gitee.com/zxbaixuexi/2024scrapy/tree/master/第四次实践 作业①: 1) 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。 候选网站:东方财富网: http://quote.eastmoney.com/cen…

项目冲刺11.12

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第四篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

快速修改kafka的broker配置或topic配置

下载开源的kafka界面客户端KafkaKing:https://github.com/Bronya0/Kafka-King 连接后,双击broker配置,或者双击topic配置:修改好后回车保存就行。有些配置是改不了的。

mysql创建表

创建表 创建表要先选中数据库名 create table 表名(列名 类型)来进行创建,列名可以存在多个,表名和列名不可以一样,想要一样的话就要使用反引号把表名和列名引起来 列名在前面,类型在后面查看所有表 show tables查看当前数据库所有表查看指定表的结构 desc 表名;把表的特…

《会计原来这么有趣》——中级实务篇(刘海涛)

第一章:存货核算 1.1存货定义:存货是指企业在日常活动中持有以备出售的产成品或商品、处在生产过程中的在产品、在生产过程或提供劳务过程中耗用的材料或物料等,包括各类材料、在产品、半成品、产成品或库存商品以及包装物、低值易耗品、委托加工物资等。 参考(https://bai…

实验15:职责链模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解职责链模式的动机,掌握该模式的结构; 2、能够利用职责链模式解决实际问题。[实验任务一]:财务审批 某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以…

题解:[JOISC 2021 Day4] イベント巡り 2 (Event Hopping 2)

P7562 [JOISC 2021 Day4] イベント巡り 2 (Event Hopping 2) lxl 上课讲了这题,我听了选取答案区间的思路,恍然大雾 ,于是就有了这篇题解—— sto lxl orz !!!本题解主要详解区间选取。 前置知识:倍增策略 首先,本题的 \(L_i\)、\(R_i\) 较大,离散化即可。 另外,我个…

团队作业4——项目冲刺-2

团队作业4——项目冲刺-2信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 小飞棍团队对需求改进和系统设计进行讨论GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗振烘(组长) 3122004748庄崇立 3122004633李响 3121002802何昌洲…

实验14:代理模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解代理模式的动机,掌握该模式的结构; 2、能够利用代理模式解决实际问题。[实验任务一]:婚介所 婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪…

Bulk-Crap-Uninstaller:一个高效卸载,轻松管理你的应用程序的.Net开源工具

我们在工作中,经常需要安装大量的软件,随着应用程序的不断增多,管理这些软件变得非常困难。 下面介绍一款具备高效、简洁的特点,可以帮助我们快速卸载大量不需要的应用程序,让电脑管理变得更加轻松。01 项目简介 Bulk-Crap-Uninstaller是一款开源的软件卸载工具,基于.Net…