后缀数组
表示排名为 的后缀起点下标。
表示后缀 的排名。
求 SA#
的基本思路是倍增。
假设已知 开头长为 的串的排名为 ,只需要根据 和 进行双关键字排序就能得到 开头长为 的串的排名。每一次长度能倍增。最后得到每一个位置开头,长度为 的串的排名,相当于后缀的排名。
使用 sort
直接进行双关键字排序可以做到 ,使用基数排序可以优化至 。
有几个小优化,优化较为明显。首先按照第二关键字排序,对于开头在 的串,它们的 超过了 ,所以第二关键字为 ,按照第二关键字排序之后一定在最前面。剩下的部分,若 ,则插入 这个位置。也就是说由于上次已经对第二关键字的所有串排序了,直接插入即可。
实现有一些技巧,可以看看 OI-Wiki 上的代码。
height 数组#
下文中 表示后缀 和后缀 的最长公共前缀。
定义为 。
引理:。人话:后缀 与其前一名的最长公共前缀长度 至少 为 后缀与其前一名的最长公共前缀长度减一。
证明:
若 ,则右边不超过 ,显然成立。
否则,如图:

绿色部分即为 后缀 ,由定义知,绿色部分后一个字符 。
串红色部分 后缀。由于 ,故 串红色部分字典序必小于 串红色部分。
若 红为 红前一名,引理成立。否则考虑中间夹着的串,容易发现,引理仍成立。
故求 数组可以 ,具体地,利用引理暴力求,由于每一次只会减一,总共只能减 次,也就只能加 次了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话