洛谷 P3809:后缀排序 ← 后缀数组

【题目来源】
https://www.luogu.com.cn/problem/P3809

【题目描述】
读入一个长度为 n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序(用 ASCII 数值比较)从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为 1 到 n。

【输入格式】
一行一个长度为 n 的仅包含大小写英文字母或数字的字符串。

【输出格式】
一行,共 n 个整数,表示答案。

【输入样例】
ababa

【输出样例】
5 3 1 4 2

【说明/提示】
1≤n≤10^6

【算法分析】
● 后缀数组简介详见:
https://blog.csdn.net/hnjzsyjyj/article/details/138695966
● 倍增法求后缀数组的算法用到如下 3 个数组:
(1)后缀数组 sa[i]:
排第几的是谁?← 后缀数组中的第 i 个元素,是从第几个字符开始的后缀?
(2)名次数组 rk[i]:
你排第几?← 从第 i 个字符开始的后缀,在后缀数组中排第几?
(3)lcp[] 数组:表示后缀 sa[i] 与 sa[i−1] 的
最长公共前缀的长度。更常表述为 height[] 数组。
● sa[] 与 rk[] 是一一对应关系,互为逆运算。即存在关系 sa[rk[i]]=i 及 rk[sa[i]]=i。

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int maxn=1e6+5;//sa[i] 排第几的是谁?
//rk[i] 你排第几?
//height[i] 表示后缀sa[i]与sa[i-1]的最长公共前缀的长度
//fi[i] 表示第i个后缀的第一关键字
//se[i] 表示第i个后缀的第二关键字
//c[i] 表示关键字为i的数的个数
int sa[maxn],rk[maxn];
int fi[maxn],se[maxn],c[maxn];char s[maxn];
int n,m;void get_sa() {for(int i=1; i<=n; i++) c[fi[i]=s[i]]++;for(int i=2; i<=m; i++) c[i]+=c[i-1]; //prefix sumfor(int i=n; i>=1; i--) sa[c[fi[i]]--]=i;for(int k=1; k<=n; k<<=1) {//Radix Sort based on 2nd keyint num=0;for(int i=n-k+1; i<=n; i++) se[++num]=i;for(int i=1; i<=n; i++)if(sa[i]>k) se[++num]=sa[i]-k;//Radix Sort based on 1st keyfor(int i=1; i<=m; i++) c[i]=0;for(int i=1; i<=n; i++) c[fi[i]]++;for(int i=2; i<=m; i++) c[i]+=c[i-1];for(int i=n; i>=1; i--) sa[c[fi[se[i]]]--]=se[i], se[i]=0;//Discretize all sorted suffixes according to the first 2K charactersswap(fi,se);fi[sa[1]]=1, num=1;for(int i=2; i<=n; i++) {if(se[sa[i]]==se[sa[i-1]] && se[sa[i]+k]==se[sa[i-1]+k]) fi[sa[i]]=num;else fi[sa[i]]=++num;}if(num==n) break;m=num;}
}int main() {scanf("%s", s+1);n=strlen(s+1);m=122; //ASCII of 'z' is 122get_sa();for(int i=1; i<=n; i++) printf("%d ",sa[i]);printf("\n");return 0;
}/*
in:
ababaout:
5 3 1 4 2
*/



【参考文献】
https://oi-wiki.org/string/sa/
https://www.cnblogs.com/heyujun/p/10300582.html
https://blog.csdn.net/hnjzsyjyj/article/details/138695966
https://zhuanlan.zhihu.com/p/649662771
https://zhuanlan.zhihu.com/p/549744336
https://www.cnblogs.com/zwfymqz/p/8413523.html
https://www.cnblogs.com/Aya-Uchida/p/11361472.html










 

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

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

相关文章

【驱动】SPI

1、简介 SPI(Serial Peripheral interface)串行外设接口。 特点: 高速:最大几十M,比如,AD9361的SPI总线速度可以达到40MHz以上全双工:主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它一主多从:主机产生时钟信号,通过片选引脚选择…

详解Python测试框架Pytest的参数化

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 上篇博文介绍过&#xff0c;Pytest是目前比较成熟功能齐全的测试框架&#xff0c;使用率肯定也不…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 03

Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Neural Networks and Deep LearningWeek 03: Shallow Neural NetworksLearning Objectives Neural Ne…

13.Netty组件EventLoopGroup和EventLoop介绍

EventLoop 是一个单线程的执行器&#xff08;同时维护了一个Selector&#xff09;&#xff0c;里面有run方法处理Channel上源源不断的io事件。 1.继承java.util.concurrent.ScheduledExecutorService因此包含了线程池中所有的方法。 2.继承netty自己的OrderedEventExecutor …

华为数据之道第三部分导读

目录 导读 第三部分 第7章 打造“数字孪生”的数据全量感知能力 “全量、无接触”的数据感知能力框架 数据感知能力的需求起源&#xff1a;数字孪生 数据感知能力架构 基于物理世界的“硬感知”能力 “硬感知”能力的分类 “硬感知”能力在华为的实践 基于数字世界的…

hbase shell 启动报错问题

报错1&#xff1a; stopping hbasecat: /tmp/hbase-hadoop-master.pid: No such file or directory 报错2&#xff1a; ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeep 解决&#xff1a; 看看你启动的hbase路径是不是错了&#xff0c;大概率是这种问题 不是启动hb…

Vuex:Vue.js 的状态管理库

一、Vuex 简介 Vuex 是 Vue.js 的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 的出现解决了组件间共享状态的问题&#xff0c;使得状态管理变得简单、可预测和可维护。 二、Vuex 核心概…

快递物流查询:如何实现快递批量查询?这些技巧助你轻松应对

在日常生活和工作中&#xff0c;我们经常需要查询快递物流信息&#xff0c;尤其是当面对大量的快递包裹时&#xff0c;逐一查询无疑会耗费大量的时间和精力。这时&#xff0c;实现快递批量查询就显得尤为重要。本文将为你介绍办公提效工具一些实现快递批量查询的技巧&#xff0…

如何将draw.io的图导入word

解决办法&#xff08;有点点复杂&#xff09; 先在http://draw.io导出格式为svg矢量图格式&#xff0c;然后用visio打开svg&#xff0c;调整完界面等等之后再保存&#xff0c;然后在word里面插入visio

Android 13 aosp 默认关闭SELinux

通过adb修改 adb root adb shell setenforce 0 // 开SELinux&#xff0c;设置成模式permissive adb shell setenforce 1 // 关SELinux&#xff0c;设置成模式enforce adb shell getenforce // 获取当前SELinux状态源码修改 Android_source/system/core/init/selinu…

FFmpeg常用API与示例(一)—— 工具库篇(av_log、AVDictionary、avio)

工具层 1.av_log 可以设置日志的级别&#xff0c;这个看看名字就明白了&#xff0c;也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…

分布式事务技术方案

什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现…

Offline: Overcoming Model Bias for Robust Offline Deep Reinforcement Learning

EAAI 2023 paper Intro model-free的离线强化学习由于价值函数估计问题存在训练的稳定性以及鲁棒性较低。本文提出基于模型的方法&#xff0c;同构构建稳定的动力学模型帮助策略的稳定训练。 method 本文基于模型的方法&#xff0c;所构造的转移模型输入状态动作&#xff0…

图鸟模板-官网:基于Vue 3的前端开发新篇章

一、引言 随着前端技术的飞速发展&#xff0c;企业对于官网的需求也从简单的展示型网站向功能丰富、交互体验良好的方向转变。在这样的背景下&#xff0c;图鸟模板-官网以其基于Vue 3的纯前端开发特性&#xff0c;以及支持微信小程序、支付宝小程序、APP和H5的跨平台能力&…

Android Native发布广播Intent步骤和原理解析

Android Native层发布广播Intent步骤和原理解析 一、Native层发送广播的机制和原理1.1 广播发送接口1.2 应该如何去发送广播1.3 调用流程1.4 IActivityManager.java 二、具体实现2.1 cpp实现代码2.2 实现过程遇到的问题2.3 发送多个值 最近出于工作需要&#xff0c;要在Native层…

REFORMER: 更高效的TRANSFORMER模型

大型Transformer模型通常在许多任务上都能达到最先进的结果&#xff0c;但是训练这些模型的成本可能会非常高昂&#xff0c;特别是在处理长序列时。我们引入了两种技术来提高Transformer的效率。首先&#xff0c;我们用一种使用局部敏感哈希的点积注意力替换了原来的点积注意力…

验证码生成--kaptcha

验证码生成与点击重新获取验证码 如图所示&#xff0c;本文档仅展示了验证码的生成和刷新显示。 1. 概述 系统通过生成随机验证码图像和文本。 2. 代码分析 2.1. Maven依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptch…

JAVA基础--File

文件 为什么要知道文件 在计算机磁盘中&#xff0c;文件是一个非常重要的存在&#xff0c;大家知道我们数据都是保存在计算机磁盘&#xff0c;而磁盘以文件为载体&#xff0c;将信息存储在磁盘文件中&#xff0c;接下来我们学习的IO流也主要是对文件中的数据进行读写操作&…

第四百九十九回

文章目录 1. 概念介绍2. 使用方法2.1 固定样式2.2 自定义样式 3. 示例代码4. 内容总结 我们在上一章回中介绍了"GetMaterialApp组件"相关的内容&#xff0c;本章回中将介绍使用get显示SnackBar.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在介…

毕业论文凑字数——关于IVR自动语音应答交互式电话导航自动总机等等概念的一些剖析

目录 IVR毕业论文的讨巧思路IVR自动语音应答IVR的使用流程IVR的各种应用IVR的基本配置 一个小朋友的毕业论文要凑字数&#xff0c;所以推荐她讲一讲IVR&#xff0c;因为IVR可以翻译的名字很多&#xff0c;比如交互式语音应答&#xff0c;自动语音应答&#xff0c;自动语音服务&…