SA:从入门到入土

news/2024/10/30 12:22:50/文章来源:https://www.cnblogs.com/storms11/p/18515610

基本应用

读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序(用 ASCII 数值比较)从小到大排序。

解法

1.将每个后缀取出来,直接排序 \(O(n^2 \log n)\)
2.用hash二分LCP比较下一位,\(O(n \log^2 n)\)
3.倍增求后缀数组,\(O(n \log n)\)
4.高级方法求后缀数组,\(O(n)\)

倍增

先比较每个后缀的第一位,再比较前两位,前四位...
问题在于如何快速比较前两位,前四位。
一个有趣的性质是在比较\(2^k\)位时,我们知道\(2^{k-1}\)位的大小,所以\(2^k\)位的大小只与前一半\(2^{k-1}\)和后一半\(2^{k-1}\)有关,所以可以用基数排序由上一层推到这一层。
image

基数排序

正常基数排序,是按数位从高到低依次比较大小,比如说三位数,就先比较百位的数字,将百位为 \(0\) 的放在一起,将百位为 \(1\) 的放在一起...。然后,对十位进行比较,在百位为 \(0\) 的里面把十位为 \(0\) 的放在一起,十位为 \(1\) 的放在一起...,最后所有数都有序。
SA的基数排序,就是相当于只有两位数来排序。

代码实现

代码比较抽象要多理解,多思考

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,sa[N],rk[N],x[N],y[N],cnt,num;
char s[N];
void SA()
{for(int i=1;i<=n;i++)rk[x[i]=s[i]]++;//rk辅助数组,x是上一层的排名for(int i=1;i<=m;i++)rk[i]+=rk[i-1];for(int i=n;i>=1;i--)sa[rk[x[i]]--]=i;//正序倒序都可以,sa是排名为i的后缀的起始下标for(int k=1;k<=n;k<<=1){cnt=0;for(int i=n-k+1;i<=n;i++)y[++cnt]=i;//没有后一半是最强的,最靠前的for(int i=1;i<=n;i++)if(sa[i]>k)y[++cnt]=sa[i]-k;//如果可以做后一半,就做//正序枚举,因为y的顺序是后一半从小到大的顺序for(int i=1;i<=m;i++)rk[i]=0;//清零for(int i=1;i<=n;i++)rk[x[i]]++;//根据前一半for(int i=1;i<=m;i++)rk[i]+=rk[i-1];for(int i=n;i>=1;i--)sa[rk[x[y[i]]]--]=y[i],y[i]=0;//后一半更大的在前一半相同时排后面swap(x,y);//y临时存一下上一层x的值。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;//确定这一层的排名}if(num==n)break;//分完了m=num;} for(int i=1;i<=n;i++)cout<<sa[i]<<' ';
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>s+1;n=strlen(s+1),m=150;SA();return 0;
} 

进阶应用

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

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

相关文章

06.动态代理设计模式

06.动态代理设计模式 目录介绍01.为何要动态代理1.1 为何要动态代理 1.2 动态代理思考02.动态代理的概念2.1 动态代理定义 2.2 动态代理类比理解 2.3 动态代理参与者 2.4 动态代理步骤03.动态代理的实现3.1 罗列一个场景 3.2 用一个例子理解代理 3.3 基于接口动态代理 3.4 基于…

.NET 8.0 开源在线考试系统(支持移动端)

https://www.cnblogs.com/1312mn/p/18510576阅读目录前言 系统介绍 系统功能 支持环境 系统源码 项目部署 项目效果 项目总结 项目地址 最后前言 推荐一款基于.NET 8.0 免费开源跨平台在线考试系统,系统不仅支持桌面端,还特别优化了移动端的用户体验。 通过本系统可以轻松搭建…

GaussDB数据计算路由层(Coordinator)关键技术方案

GaussDB Kernel V5版本的Catalog还是本地存储, 所以还需要考虑catalog的持久化问题.未来演进元数据解耦,Coordinator 无状态, 就不需要考虑Catalog持久化问题了。但是跨节点场景下的事务提交在Coordinator上还是要持久化的。图14 Coordinator模块图 路由信息:每个表数据共分1…

GaussDB全局事务管理层(GTM)关键技术方案

GTM 仅处理全局时间戳请求, 64位CSN递增,几乎都是CPU ++和消息收发操作。不是每次都写ETCD, 而是采用定期持久化到ETCD 里, 每次写ETCD的CSN要加上一个backup_step (100w), 一旦GTM故障,CSN从ETCD读取出来的值保证单调递增。当前GTM 只完成CSN++, 预估可以支持200M/s 请求…

GaussDB集群管理层(CM)关键技术方案

GaussDB Kernel V5 集群管理层关键模块如下。图4 集群管理层组件设计图 CM 组件提供了四种服务 CM Agent, CM Server, OM Monitor, cm_ctl,与各类实例服务组件(CN, DN, GTM 等)一起构成了整个数据库集群系统。cm_ctl通过命令行执行集群的启动、停止、状态查询、主备倒换、备…

2024年10月中国数据库排行榜:TiDB续探花,GaussDB升四强

10月墨天轮排行榜解读已发布!OceanBase、PolarDB、TiDB三甲格局稳定,GaussDB排名攀升至第四,此外亦有部分产品表现亮眼,一起来看更多排名情况与解读。10月中国数据库流行度排行榜如期发布,再次印证了市场分层的加速形成。国家数据库测评结果已然揭晓,本批次通过的产品数量…

GaussDB技术解读——查询优化器

查询优化阶段主要是SQL执行过程中在优化器SQL Optimizer中执行的部分,优化器作为数据库的大脑是SQL执行路径决策者,从全局视角出发提升查询的性能,降低用户使用数据库调优的门槛。查询优化总体上分为逻辑优化、物理优化。查询优化从总体上可以分成两类: 1、基于规则的逻辑优…

markdown矩阵分块和latex中矩阵分块记录

1. markdown中常见的符号附件 \hat{X} \widehat{X} \check{X} \breve{X} \tilde{X} \dot{X} \ddot{X} \overline{X} \underline{X}2. markdown中矩阵 由\left[ right], \begin{array}{ccc} \end{array}包围,分行由\\实现,分列通过ccc固定列数,列与列间用&分割 代码:\…

二、DEBUG模式及常用指令

debug概述 debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用他可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行 debug的功能 调试(Debug)的命令比较多,共有20多个,但这6个命令是和汇编学习密切相关的。 在以后的实验中,我们还会用…

207-FMC207-基于FMC 两路QSFP+光纤收发子卡

FMC207-基于FMC 两路QSFP+光纤收发子卡 一、板卡概述本卡是一个FPGA夹层卡(FMC)模块,可提供高达2个QSFP / QSFP +模块接口,直接插入千兆位级收发器(MGT)的赛灵思FPGA。支持利用Spartan-6、Virtex-6、Kintex-7 、Virtex-7FPGA系列FPGA。兼容xilinx 开发板使用。 实现高…

数据采集与融合实践作业三

数据采集与融合技术实践作业三 scrapy项目gitee链接:https://gitee.com/jsjdjjdjajsd/getinformation/tree/master/作业三 作业①: 要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线…

《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense

《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense@目录五、新的组件1.Fragment2.Teleport案例完整代码3.Suspense案例完整代码本人其他相关文章链接 五、新的组件 1.Fragment在Vue2中: 组件必须有一个根标签 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在…