后缀数组
-
基数排序
算法思想:利用桶的单调性,从低到高位依次将整数放进对应数位的桶中。
时间复杂度: ,其中 为数位, 为元素个数, 为桶的大小。 -
后缀树
对于字符串 ,取出 所有的后缀字串,并建立字典树。这个树就是 的后缀树。空间复杂度 。 -
后缀数组 SA
对于字符串 ,定义sa[i]
表示 的 个后缀按字典序排序后的第 个后缀在 中的下标,其中 从 开始。 -
后缀数组的实现
直接使用 sort 排序,由于字符串的比较是 的,总时间复杂度 。
倍增求 sa[]
。
- 将
中的字母按照字典序从 开始分配整数。 - 倍增拼接连续
的整数来代表每个后缀的排名,当拼接的数字互不相同时即停止,由得到的数字sort
即可确定字典序。
最坏复杂度
拼数的时候可以每次重新编号,长度控制在两位数。 - 利用基数排序的优化
拿基数排序替换快排。d=2
,所以跑的很快。
rnk[i]
表示以下标
易知 sa[rnk[i]]=i;rnk[sa[i]]=i;
。
height[i]
表示 lcp(sa[i-1],sa[i])
。
应用:
- 在串里找最长重复子串:max(height)
- 找s和t的最长公共子串:在s+"#"+t里做最长重复子串,且sa[i-1]和sa[i]在两边。
- 本质不同子串数量:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现