当前位置: 首页 > 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实现的二手交易系统
  • __proto__ 和 prototype的关系
  • 【个人向】《HTTP图解》阅后小结
  • avalon2.2的VM生成过程
  • css布局,左右固定中间自适应实现
  • Java程序员幽默爆笑锦集
  • Java的Interrupt与线程中断
  • JS数组方法汇总
  • KMP算法及优化
  • Python连接Oracle
  • vagrant 添加本地 box 安装 laravel homestead
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • win10下安装mysql5.7
  • yii2权限控制rbac之rule详细讲解
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 分享一份非常强势的Android面试题
  • 离散点最小(凸)包围边界查找
  • 力扣(LeetCode)965
  • 浏览器缓存机制分析
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 我有几个粽子,和一个故事
  • 学习ES6 变量的解构赋值
  • 在weex里面使用chart图表
  • #AngularJS#$sce.trustAsResourceUrl
  • #define与typedef区别
  • #pragma 指令
  • (+4)2.2UML建模图
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (TOJ2804)Even? Odd?
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)ssm高校实验室 毕业设计 800008
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .Net Core和.Net Standard直观理解
  • .NET delegate 委托 、 Event 事件
  • .Net 路由处理厉害了