2715. 后缀数组
题目链接
2715. 后缀数组
给定一个长度为 的字符串,只包含大小写英文字母和数字。
将字符串中的 个字符的位置编号按顺序设为 。
并将该字符串的 个非空后缀用其起始字符在字符串中的位置编号表示。
现在要对这 个非空后缀进行字典序排序,并给定两个数组 和 。
排序完成后,用 来记录排名为 的非空后缀的编号,用 来记录排名为 的非空后缀与排名为 的非空后缀的最长公共前缀的长度()。
特别的,规定 。
请你求出这两个数组。
输入格式
共一行,包含一个长度为 的仅包含大小写英文字母或数字的字符串。
输出格式
第一行包含 个整数,表示 数组。
第二行包含 个整数,表示 数组。
数据范围
输入样例:
输出样例:
解题思路
后缀数组,倍增
后缀数组有两个关键的数组:
在后缀形成的数组 中,
-
数组表示数组 中 排名为 的数组下标
-
表示 和 的最长公共前缀
基于基数排序的思想,设置一个桶 表示值为 的数的数量,先将所有后缀子串按第一个字符排序,基数排序是稳定的,当第一个字符相等时不会改变原后缀子串的顺序,每次排序按长度排序,长度不足后面用字典序最小的字符补齐,例如前一次倍增排好了长度为 的子串,此时排序长度为 的子串,由于基数排序的稳定性,整体上可以将长度为 的子串先将后 个字符排序,再将前 个字符排序,这样可以保证对于长度为 的子串来说,前 个子串相等,后 个子串也会是排好序的,这样长度为 的子串就排好了序,同时可求解 数组
- 时间复杂度:
先定义函数 :表示排名为 和 的最长公共前缀,则有 ,其中
证明:先证明 ,假设 为某一段,如果 要小于该段,显然会导致 不应该处在 和 之间,矛盾,故 ,同理 ,即 ;再证明 ,当 时,如果 ,此时会导致 不止原来这么小,所以 ,故 ,当 时,显然也有 ,故 ,很容易引申出
再定义数组 表示下标为 的后缀和排名为 的后缀的最长公共前缀,则有
证明:假设第 个后缀的排名比第 个后缀靠前,靠后的话也是同样考虑,如果 即第 个后缀与前一个排名的后缀的第一个字符不相等,显然有 ,否则第 个后缀除去第一个字符正好对应第 个后缀,考虑第 个后缀的前一个排名的后缀除去第一个字符后的后缀 ,除去第一个后缀后,两者顺序不变,第 个后缀变为第 个后缀,所以此时 在 的前面,由上面的定理,,即有 ,即
定义数组 表示下标为 的排名,则
而又有 ,求出 等价于求出 数组
- 时间复杂度:
代码
__EOF__

本文链接:https://www.cnblogs.com/zyyun/p/16201087.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!