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

[acm算法学习] 后缀数组SA

学习自B站up主 kouylan 

定义

后缀是包含最后个字母的子串

把字符串 str 的所有后缀按字典排序,sa[i]表示排名为 i 的后缀的开头下标

如何求解SA

倍增的方法

先把每个位置开始的长度为1的子串排序,在此基础上再把长度为2的子串排序(长度为2的子串就 是前面算过的长度为1的子串再加上后面的一位,第 i 位的和 i+1 ),再把长度为4,8,16,32...(两个两个拼)直到串的末尾,也就是排到了后缀。

如何从2^(k-1) 到 2^k

  • 记 rk[i] 表示当前长度下,i 开始的子串的排名
  • 前 2^(k-1) 和后  2^(k-1) 拼成了 2^k
  • 确定  2^k 的排名时,先比较前 2^(k-1)的rk,如果更小,那么整个也更小,不用比后面了;如果前 2^(k-1)相等,则去比较后  2^(k-1) 的rk

up主给的这个图很形象

原串中下标位置为1的a,会去和原串中下标为2的b拼一起,a(1)和a(6)的rk相同,所以比较后面部分,b(2) 比 c(7) 的 rk 要先,所以最后长度为2的 rk 里ab 比 ac 要前。由于c(7)是最后一位了,所以它的下一位是个空串,我们定义空串的rk是-1,这样,因为没有比空串还小的了,设为-1可以达到效果。

求解程序

sa 是根据 rk 来的,根据排序好的 sa 来更新 rk2 (使用临时变量 rk2),因为更新的过程中要用到上一次的 rk ,初始的rk是字典序。

用sort在当前 k 下把 sa 数组排好顺序,然后再遍历一遍数组sa把对应位置的字母排名依次排好。最后更新一遍rk。

重载的排序函数,是根据先比前一半,后比后一半。

时间复杂度 n*log(n)*log(n)

相关文章:

  • 如何使用创建时间给文件重命名,简单的批量操作教程
  • git 提交符号
  • ipad协议逆向分析实战篇-1
  • 深度学习 基本理论 3 :物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip
  • what is BERT?
  • Nacos:通过Dockerfile构建自定义Nacos镜像
  • 【linux】Ubuntu 22.04.3 LTS截屏
  • VS游戏打包教程
  • 洛谷最经典题目之--垂直柱状图
  • 面试宝典之消息中间件面试题
  • set -e的作用
  • 【踩坑】flask_uploads报错cannot import name ‘secure_filename‘
  • 简单的天天酷跑小游戏实现
  • 全自动网页生成系统网站源码重构版
  • 基于SpringBoot+Vue实现的二手交易系统
  • 【EOS】Cleos基础
  • Codepen 每日精选(2018-3-25)
  • JAVA_NIO系列——Channel和Buffer详解
  • Java的Interrupt与线程中断
  • Making An Indicator With Pure CSS
  • Median of Two Sorted Arrays
  • node入门
  • react 代码优化(一) ——事件处理
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue 配置sass、scss全局变量
  • 前端路由实现-history
  • 前言-如何学习区块链
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 提醒我喝水chrome插件开发指南
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序--------语音识别(前端自己也能玩)
  • 学习笔记:对象,原型和继承(1)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #宝哥教你#查看jquery绑定的事件函数
  • (26)4.7 字符函数和字符串函数
  • (5)STL算法之复制
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)h264中avc和flv数据的解析
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .chm格式文件如何阅读
  • .NET CORE Aws S3 使用
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net 高效开发之不可错过的实用工具
  • .net6使用Sejil可视化日志
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET框架类在ASP.NET中的使用(2) ——QA