后缀数组模板之高度数组

高度数组

1.理解相关数组的含义

  1. rk[i]:表示原始下标为i的后缀字符串排序后对应的下标(也就是原始下标为i的后缀字符串排序后为第rk[i]小)

  2. height[i]:表示排名为i和i-1的后缀字符串的最长公共前缀的长度,注意这里的i是排名,不是原始下标

2.定理证明

定理:height[rk[i]]>=height[rk[i-1]]-1

采用先抽象后具体的方式进行详细的证明。

抽象证明

假设原始下标i-1对应的后缀字符串为sAB,则按字典序排序后排在rk[i-1]-1位的后缀字符串为sAC。注意这里的s表示某个字符,A、B和C表示某些字符。那么lca(sAB,sAC)=sA=height[rk[i-1]]。

则原始下标i对应的后缀字符串为AB,目前已知有后缀字符串AC的字典序比AB小,而lca(AB,AC)=A=height[rk[i-1]]-1,则按字典序排序后排在rk[i]-1位的后缀字符串为不一定为AC,但是如果存在一个字符串按照字典序排序后插在AB和AC之间,至少该字符串一定包含A,假设该字符串是AD,那么在D里面可能存在某些字符与B里的字符相等,因此lca(AB,AD)>=height[rk[i-1]]-1,至此定理得证。

实例证明

假设原始下标i-1对应的后缀字符串为abcedc,则按字典序排序后排在rk[i-1]-1位的后缀字符串为abcabcedc。此时我们用的是具体的字符串,不再是抽象表示,这里的a可以看作上面的s,bc可以看作上面的A,edc可以看作上面的B,abcedc可以看作上面的C。那么lca(abcabcedc,abcedc)=abc=3=height[rk[i-1]]。

则原始下标i对应的后缀字符串为bcedc,目前已知有后缀字符串bcabcedc的字典序比bcedc小,而lca(bcedc,bcabcedc)=bc=2=height[rk[i-1]]-1。但是按字典序排序后排在rk[i]-1位的后缀字符串为不一定为bcabcedc。如果存在一个字符串按照字典序排序后插在bcedc和bcabcedc之间,至少该字符串一定包含bc。如字符串是bcbabcabcedc,按照字典序他应该在bcedc和bcabcedc之间,此时lca(bcedc,bceabcabcedc)=3>height[rk[i-1]]-1,至此定理得证。

建议边读边自己在本子上写,帮助理解。

3.模板代码

private static void get_height() {// TODO Auto-generated method stubfor(int i = 1;i <= n;i++) rk[sa[i]] = i;for(int i = 1,k = 0;i <= n;i++) {if(rk[i] == 1) continue;if(k != 0) k--;int j = sa[rk[i]-1];while(k+i <= n && j + k <= n && s[k+i] == s[k+j]) k++;height[rk[i]]=k;}
}
  1. rk数组和sa数组互为逆,所以可以通过sa数组快速得到rk数组rk[sa[i]] = i

  2. 字典序排名为i的字符串不需要求高度数组if(rk[i] == 1) continue;

  3. k记录的是上一个后缀数组的高度数组大小,根据定理当前从k-1开始找即可,所以有if(k != 0) k--;

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

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

相关文章

红帽认证RHCE9.0版本2023年12月的红帽9.0版本RHCSA题⽬+答案,本人已过,全国通用

红帽认证9版本2023年12月的红帽9.0版本RHCSA题⽬答案&#xff0c;本人已过&#xff0c;全国通用 需要完整的RHCSA和RHCE的考试答案的题目以及RHCE9考试的模拟环境和考试笔记教材的请添加微信&#xff0c;需备注来自csdn&#xff0c;不然通不过 1、配置⽹络设置? 将?node1?…

「Verilog学习笔记」RAM的简单实现

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1ns module ram_mod(input clk,input rst_n,input write_en,input [7:0]write_addr,input [3:0]write_data,input read_en,input [7:0]read_addr,output reg…

关于uview-ui的u-tabs标签滑块不居中的问题

在uniapp中&#xff0c;打开文件 uni_modules/uview-ui/components/u-tabs/u-tabs.vue 然后在style中添加以下代码即可 /deep/ .u-tabs__wrapper__nav__line {left: 18rpx; } 之前效果图&#xff1a; 之后效果图&#xff1a; 注意&#xff0c;代码中的18rpx需要自行调整

语音机器人话术设计重点

要使用语音机器人&#xff0c;首先得要先准备一套业务的话术脚本&#xff0c;这个话术脚本的设计&#xff0c;可能直接决定了语音机器人后续的使用效果。这个脚本的编写一般不是机器人厂家直接能完成的&#xff0c;只有业务的使用方&#xff0c;他们才最了解自己的业务&#xf…

报错“找不到mfc100u.dll,程序无法继续执行”的解决方法,完美解决

在软件操作过程中&#xff0c;部分用户可能遇到"计算机缺失mfc140u.dll导致无法启动程序"的困扰。这种情况常常发生在启动某特定应用&#xff0c;特别是需要VC Redistributable支持的软件时。以下为详尽解决策略&#xff0c;让用户轻松应对这类技术难题&#xff0c;重…

LeetCode-739. 每日温度【栈 数组 单调栈】

LeetCode-739. 每日温度【栈 数组 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;单调栈&#xff0c;顺序遍历数组维护单调递减栈&#xff0c;在出栈的时候得出答案。可以参考[LeetCode-503. 下一个更大元素 II【栈 数组 单调栈】](https://blog.csdn.net/qq_45934285/a…

【1】自动化测试环境配置(ARM服务器)

想要从事 or 了解自动化测试开发、装备开发的小伙伴&#xff0c;本专栏内容将从0到1学习如何针对ARM服务器产品进行自动化测试平台的搭建&#xff0c;包括&#xff1a;测试界面的实现&#xff08;GUI&#xff09;、测试项的功能实现&#xff08;压力测试、接口测试、版本更新&a…

【轻松掌握】Swoole简单入门教程,让你成为PHP高手!

Swoole简单入门示例 Swoole可以让PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP&#xff0c;WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 前提 使用Composer构建项目…

企业异地组网选新型技术SD-WAN还是传统方式MPLS?

案例背景&#xff1a; 某集团企业决定扩大其商业版图&#xff0c;在国内新开了几家分公司。然而&#xff0c;在面对如何进行组网的问题上&#xff0c;陷入了纠结。究竟选择传统的MPLS&#xff08;多协议标签交换&#xff09;还是尝试SD-WAN&#xff08;软件定义广域网这个新兴…

LeetCode 每日一题 Day 12 (Hard)|| 二维前缀和二维差分

2132. 用邮票贴满网格图 给你一个m x n的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中&#xff0c;且满足以下 限制 和 …

PhotoMaker——通过堆叠 ID 嵌入定制逼真的人像照片

论文网址链接&#xff1a;https://arxiv.org/abs/2312.04461 详情网址链接&#xff1a;PhotoMaker 开源代码网址链接&#xff1a;GitHub - TencentARC/PhotoMaker: PhotoMaker 文本到图像AI生成的最新进展在根据给定文本提示合成逼真的人类照片方面取得了显着进展。然而&#…

Ubuntu20.04 配置NTP服务器

# 安装ntp服务 sudo apt-get install ntp ntpdate # 修改ntp服务配置文件 sudo vi /etc/ntp.conf # /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help # driftfile记录时间差异 driftfile /var/lib/ntp/ntp.drift# Leap seconds definition provided by tz…

day17 二叉树的所有路径

void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) { path.push_back(cur->val); // 中&#xff0c;中为什么写在这里&#xff0c;因为最后一个节点也要加入到path中 // 这才到了叶子节点 if (cur->left NULL &&a…

Java: OpenWeatherMap json Deserialization of Java Objects

openweathermap.json {"coord": {"lon": 114.0683, "lat":22.5455},"weather":[ {"id": 803, "main":"Clouds", "description":"多云", "icon":"04d"}],&quo…

使用Java实现PDF填充图片功能

一、引言 在软件开发中&#xff0c;将图片填充至PDF文件是一项常见的需求。为了满足这一需求&#xff0c;我们可以使用Java编程语言和相关的库来实现。本文将介绍如何使用Java和iText库来实现PDF填充图片的功能。 二、准备工作 在开始之前&#xff0c;我们需要确保已经安装了…

FAQ:Inheritance 篇——What your mother never told you

文章目录 1、How can I set up my class so it won’t be inherited from&#xff1f;&#xff08;如何设置类&#xff0c;使它不会被继承?&#xff09;2、How can I set up my member function so it won’t be overridden in a derived class? &#xff08;如何设置成员函数…

cgal教程 3D Alpha Wrapping

文章目录 3D Alpha Wrapping (3D alpha 包裹)1 介绍2 方法2.1 算法2.2 保证 3 接口4 选择参数4.1 alpha4.2 Offset4.3 关于“双面”包裹的注意事项 5 性能6 例子 3D Alpha Wrapping (3D alpha 包裹) 原文地址: https://doc.cgal.org/latest/Alpha_wrap_3/index.html#Chapter_3D…

springcloudalibaba01

整合springcloud 和 springcloudalibaba&#xff0c;&#xff0c;&#xff0c; 版本对应关系 <dependencyManagement><dependencies><!--每个springcloud的工具都有一个版本每个springcloud alibaba的工具都有一个版本统一版本--> <!-- 整合…

vivado约束方法6

生成的时钟 定时约束向导建议在的输出上创建一个生成的时钟顺序单元&#xff0c;当它直接或通过驱动其他顺序单元的时钟引脚时一些互连逻辑。与PLL或MMCM不同&#xff0c;用户逻辑不能将主时钟&#xff0c;因此向导仅提供指定除法系数的选项&#xff0c;如中所示如下图所示&am…

SpringMVC框架是干什么的

动态SQL之Foreach是什么 Foreach是Mybatis中动态SQL语句中的一种特殊标签&#xff0c;它可以用于对Java集合类型进行遍历&#xff0c;并将集合中的元素作为参数传递给SQL语句中的占位符。 Foreach标签一般包含三个属性&#xff1a; collection&#xff1a;指定要遍历的Java集…