后缀数组和高度数组 模板及应用

本文详细介绍了后缀数组的概念、计算原理和代码实现,包括基于后缀数组的字符串匹配算法。同时,文章还探讨了高度数组,即相邻后缀的最长公共前缀数组,讲解了其计算方法和应用,如求解最长公共子串、最长回文串等。通过预处理和二分搜索,实现了高效的字符串操作算法。
摘要由CSDN通过智能技术生成

后缀数组

特别注意: 下面的代码都是来自挑战程序设计竞赛, lcp[i]代表的是后缀Suffix[sa[i]]后缀Suffix[sa[i+1]]的最长公共前缀, 而网上比较流行的那个模板的height[i]则是后缀Suffix[i]与Suffix[sa[i-1]]的最长公共前缀, 挑战上的模板速度慢一些, 但是好写很多, 并且因为用的是快速排序数值范围比较大的时候不需要离散化

原理

为了方便处理一些情况, 我们把空串也当做一个后缀, 所以长度为n的字符串有n+1个后缀.
sa[i] 表示以S[sa[i]]开头的后缀是字符串所有后缀中字典序第i的.
rank[i]表示以S[i]开头的字符串在字符串所有后缀中排第rank[i]位.
用倍增法计算后缀数组.
记rk[i, j]为子串S[i…i+ 2j -1]在所有长度为 2j 长度的子串中的字典序排名, 如果i+ 2j -1超过了字符串的末尾, 则为S[i, n-1].
如果我们知道了所有的rk[i, j], 那么, 所有的rk[i, j+1]可以通过rk[i, j]和rk[i+ 2j , j]快速计算出来.
而一开始的rk[i, 0]是长度为1的子串, 可以直接通过每个字符的编码值得到(rk[i, 0] = int(S[i]);).

代码

效率 O(nlo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值