当前位置: 首页 > news >正文

后缀数组

后缀数组感觉有点不好解释,简单记录一下板子。

后缀数组性质

lcp(i, j):指的是第i个后缀以及第j个后缀的最大公共前缀的长度

  • lcp(i, j) = lcp(j, i)

  • lcp(i, i) = len(i)

  • lcp(i, j) = min(lcp(i, k), lcp(k, j))

在o(nlogn)的时间复杂度内处理一个字符串,得到三个数组。

sa[i]:表示排名为i的后缀是字符串中第几个后缀。

rk[i]:表示字符串中第几个后缀的排名。

height[i]:sa[i] 与 sa[i - 1] 的后缀的最长公共前缀的长度。

int n, m;
int o[N];
int c[N], x[N], y[N], sa[N], rk[N], height[N];
char s[N];
// x:最开始表示每个字符离散化后的值,也就是Ascll码,第一关键值
void get_sa() {for(int i = 1; i <= n; i ++) c[x[i] = s[i]] ++; for(int i = 2; i <= m; i ++) c[i] += c[i - 1];for(int i = n; i; i --) sa[c[x[i]] --] = i; // 以上是得到按照第一个字符进行排序后的后缀顺序sa,以及x数组,也就是每个后缀的第一关键字 for(int k = 1; k <= n; k <<= 1) { int num = 0;for(int i = n - k + 1; i <= n; i ++) y[++ num] = i; // 没有第二关键字就是最小的直接排序就行 for(int i = 1; i <= n; i ++) if(sa[i] > k) // 当前大小排名为i的后缀存在第二关键字  y[++ num] = sa[i] - k; // 减k之后才是以当前为第二关键字的后缀// 以上是按照第二关键字进行排序得到排序后的后缀顺序y  for(int i = 1; i <= m; i ++) c[i] = 0;for(int i = 1; i <= n; i ++) c[x[i]] ++; for(int i = 2; i <= m; i ++) c[i] += c[i - 1];for(int i = n; i; i --) sa[c[x[y[i]]] -- ] = y[i], y[i] = 0; // 以上是按照第一关键字进行排序之后的后缀顺序sa// 当前的操作已经完成,需要更新一下第一关键字,因为对于下一次循环的排序来说,第一关键字是当前的第一关键字和第二关键字的整体,所以需要对这个整体进行离散得到新的x数组第一关键字 swap(x, y); // y已经没用了,直接用来存储之前的第一关键字进行使用x[sa[1]] = 1, num = 1; // 第一个位置for(int i = 2; i <= n; i ++)  x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? num : ++ num; // 如果第一关键字和第二关键字都相同则num值等于上一个位置,否则加一,因为当前的sa顺序已经是排序之后的,只需要考虑相等值得离散值相同即可。if(num == n) break; // 排序完成m = num;// 更新一下值域范围,一个小的时间优化}
} void get_height() {for(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) k --; int j = sa[rk[i] - 1];while(i + k <= n && j + k <= n && s[i + k] == s[j + k]) k ++;height[rk[i]] = k;} 
}inline void sovle() {cin >> s + 1;n = strlen(s + 1), m = 122;get_sa();get_height();for(int i = 1; i <= n; i ++) cout << sa[i] << " ";cout << endl;for(int i = 1; i <= n; i ++) cout << rk[i] << " ";cout << endl;for(int i = 1; i <= n; i ++) cout << height[i] << " ";cout << endl;
}

相关文章:

后缀数组

后缀数组感觉有点不好解释&#xff0c;简单记录一下板子。 后缀数组性质 lcp(i, j):指的是第i个后缀以及第j个后缀的最大公共前缀的长度 lcp(i, j) lcp(j, i) lcp(i, i) len(i) lcp(i, j) min(lcp(i, k), lcp(k, j)) 在o(nlogn)的时间复杂度内处理一个字符串&#xff…...

矩阵的初等变换

1.矩阵的初等变换的分类&#xff1a; 1.按类型分&#xff1a;初等行变换&#xff08;动行&#xff09;&#xff0c;初等列变换&#xff08;动列&#xff09; 2.按方式分&#xff1a; 1.交换矩阵的两行或者两列 2.用一个不为0的数乘矩阵的某一行 3.用一个任意的数乘矩阵的某一行…...

Redis面试题:分片集群相关问题

目录 面试官&#xff1a;redis的分片集群有什么作用 面试官&#xff1a;Redis分片集群中数据是怎么存储和读取的&#xff1f; 面试官&#xff1a;redis的分片集群有什么作用 候选人&#xff1a;分片集群主要解决的是&#xff0c;海量数据存储的问题&#xff0c;集群中有多个m…...

leetcode设计循环队列(链表方式来实现)

上次我们那个设计循环队列的时候用的是数组&#xff0c;因为那个时候还是不太会链表&#xff0c;现在有了链表的思路&#xff0c;我们一起来看看解题步骤吧。 https://leetcode.cn/problems/design-circular-queue/description/ 设计循环队列 那我们其实最主要的就是我们这个…...

什么是高级语言、机器语言、汇编语言?什么是编译和解释?

1、高级语言 计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种&#xff0c;例如 C、C、Java、Python 等。这些语言被称为高级语言&#xff0c;因为它们更接近人类的自然语言&#xff0c;而不是计算机能够直接…...

简要介绍Spring原生框架与Spring是轻量级框架的原因

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…...

成为AI产品经理——AI产品经理工作全流程

目录 一、业务背景 二、产品工作流程 1.需求定义 2.技术预研 3.数据准备 4.模型构建、宣讲和验收 5.工程开发及产品上线运营 一、业务背景 背景&#xff1a;排球日常训练活动、排球中考项目和排球体测项目耗费了大量人力成本和时间成本。 目标&#xff1a;开发一套用…...

git commit 撤销的三种方法

一般在提交代码的时候&#xff0c;顺序是这样的 git status // 查看修改文件状态&#xff08;已添加至暂存区还是未添加至暂存区&#xff09;git add . // 添加所有已修改文件 git add xxx/xxx // 添加目录为xxx/xxx的文件至暂存区git commit -m xx功能全部完成 // 提交暂存区…...

Linux系统编程 day06 进程间通信

进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下&#xff0c;进程地址空间是相互独立的&#xff0c;每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容&#xff0c;要进行数据交换必…...

血的教训--redis被入侵之漏洞利用复现--总览

血的教训–redis被入侵之漏洞利用复现–总览 相信大家对于自己的服务器被入侵&#xff0c;还是比较憎恨的&#xff0c;我的就被攻击了一次&#xff0c;总结经验&#xff0c;自己也是整理了这一个系列&#xff0c;从最基础到最后面的自己总结被攻破的步骤&#xff0c;非常清晰的…...

C语言矩阵乘积(ZZULIOJ1127:矩阵乘积)

题目描述 计算两个矩阵A和B的乘积。 输入第一行三个正整数m、p和n&#xff0c;0<m,n,p<10&#xff0c;表示矩阵A是m行p列&#xff0c;矩阵B是p行n列&#xff1b;接下来的m行是矩阵A的内容&#xff0c;每行p个整数&#xff0c;用空格隔开&#xff1b;最后的p行是矩阵B的内…...

用windows自带的FTP服务器实现同一局域网建立ftp服务器实现文件共享的详细步骤

原理 Windows自带的FTP服务器是Internet Information Services&#xff08;IIS&#xff09;组件的一部分&#xff0c;可以用于同一局域网建立FTP服务器以实现文件共享。下面是使用Windows自带的FTP服务器实现文件共享的详细步骤&#xff1a; 安装IIS组件&#xff1a; 打开控制…...

SpringBoot——模板引擎及原理

优质博文&#xff1a;IT-BLOG-CN 一、模板引擎的思想 模板是为了将显示与数据分离&#xff0c;模板技术多种多样&#xff0c;但其本质都是将模板文件和数据通过模板引擎生成最终的HTML代码。 二、SpringBoot模板引擎 SpringBoot推荐的模板引擎是Thymeleaf语法简单&#xff0…...

java开发中各个环境的适用场景

java开发中各个环境的适用场景 一.开发环境 在系统开发的经典模型&#xff0c;一般会分成 2 类 5 种环境&#xff1a; 【线下】本地环境(local)、开发环境(dev)、测试环境(test) 【线上】预发布环境(stage)、生产环境(prod) 每个环境、每个项目使用独立的二级域名 线下、线…...

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(二):面向对象思想

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第二部分:面向对象思想,子节点表示追问或同级提问 面向对象基…...

Redis 反序列化失败

文章目录 问题原序列化配置修改配置解决方法 问题 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of org.springframework.security.core.authority.SimpleGrantedAuthority (although at least one Creator exists): cannot deser…...

uniapp 导航分类

商品分类数据&#xff0c;包括分类名称和对应的商品列表点击弹出 列表的内容 展示效果如下&#xff1a; 代码展示 ①div部分 <view class"container"><view class"menu-bar"><view class"menu"><view class"menu-sc…...

Vue + Element UI 实现复制当前行数据功能及解决复制到新增页面组件值不更新的问题

文章目录 引言第一部分&#xff1a;复制当前行数据功能的实现1.1 环境准备1.2 创建表格并渲染数据1.3 解决复制的数据不更新问题 第二部分&#xff1a;拓展知识2.1 Vue的响应性原理2.2 Element UI的更多用法 结语 Vue Element UI 实现复制当前行数据功能及解决复制到新增页面组…...

智慧化工~工厂设备检修和保全信息化智能化机制流程

化工厂每年需要现场检修很多机器&#xff0c;比如泵、压缩机、管道、塔等等&#xff0c;现场检查人员都是使用照相机&#xff0c;现场拍完很多机器后&#xff0c;回办公室整理乱糟糟的照片&#xff0c;但是经常照了之后无法分辨是哪台设备&#xff0c;而且现场经常漏拍&#xf…...

【LeetCode热题100】【哈希】字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...