后缀数组学习笔记
后缀数组SA的学习笔记
1 一些基本定义
表示字符串从 开始的后置。简单记作 后缀。 后缀 的排名,得到的是一个排名 排名为 的后缀是谁。(这就是我们要求的后缀数组SA)得到的是一个后缀 ,两个字符串的最长公共前缀
2 算法流程
我们考虑使用倍增的做法,我们可以先求出长度为 1 的情况的下的排名,然后长度为 2 的字符串就是由前后两个长度为1的拼起来的,然后我们使用基数排序的思想,用两个桶,就可以求出合并后的排名了。然后更新一下下一轮的答案就好。
3 code
4 LCP
4.1 基础定义
虽然我们已经讲完了SA了,但是LCP是后缀数组的题目中经常要用上的东西,所以也是要讲的。
我们定义
我们定义一个很重要的东西
然后我们会有一个非常强大的定理
考虑证明:
对于
考虑
那么设
显然
4.2 求 h 数组
有了上面这个定理,就可以暴力求这个式子了。
4.3 关于 h 的一些应用
- 比较两个子串的大小关系:有两个子串
,若 的话,会有 与 互相为充要条件。否则, 与 互为充要条件。非常的显然。 - 不同子串的数目: 结论就是总数减去
。因为有 。所以按SA的顺序去枚举这些后缀的话,他与前面的 都不会大于 ,所以 位之后的都是不同的字符。
5 一些题目
P2852 [USACO06DEC] Milk Patterns G
出现至少
P1117 [NOI2016] 优秀的拆分
给你一个字符串,如果一个字符串可以被拆分成AABB的形式,那么这种拆分是优秀的,同一个字符串不同AB算是不同的拆法,问给出的字符串的所有的子串的优秀拆分数之和。
显然,AABB其实可以看成两个AA拼接起来,所以我们只需要求出AA的数量,为了不重复,我们需要求出以i开头的AA的数量和以i结尾的AA的数量,答案就是
显然, 这居然有足足95pts,显然考场上剩下的5pts是没有拿的意义的。考虑如何优化。
我们枚举 A 的长度
然后我们每隔
总结:
感觉这个正解比较逆天,考场上不是很想得到。但是以后遇到类似于求 AA 这种东西的可以借用这道题的思路。再想了一下,还是逆天,太跳脱了,不过调这道题的时候注意到,因为各种奇怪的边界问题,所以在多测的时候,
P2178 [NOI2015] 品酒大会
这个问题分成两问,第一问求的是
还是考虑新加入一个后缀
所以每次新加一个数,我们设他的值为
考虑怎么求第二问,感觉可以跟第一问一起求,每个状态再记录一下最大值与最小值。每次删除一个状态的时候用这个加入的状态乘起来就好。就是修改的标记可能要用
看了一下感觉这个就是正解,但是实在不好打,艹。
一种更加简单的写法,我们发现这个标记是会一直存在的,把它当成一并查集,每次合并相邻的两个状态,并把他们的标记合并。并更新一下他们的
具体来说,每个点记录他上一个跟他不在同一个并查集的点的位置,如果他的值小于他的上一个,就合并他们两个对应的并查集。并把当前点
__EOF__

本文链接:https://www.cnblogs.com/shadom/p/17995831.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具