【2019正睿金华集训】0805总结(后缀数组)

今日学习:后缀数组

我还记得几天前在B班的时候,dls两句话讲完了后缀数组,然后说:大家都会了吧?然后我整个人都不好了。
今天R姓大佬一反前天在B班的淡淡不耐烦,变成了一个耐心讲解的好老师,我居然神奇的听懂了%%%
感觉后缀数组基本上是一个模板,主要操作就是对三个数组SA,rk,height数组进行操作,常用的有二分答案等。

推荐博客:https://www.cnblogs.com/victorique/p/8480093.html

后缀数组就是将字符串的n个后缀拿出来进行排序。

sa[i]表示以排名为i的后缀的第一个字母的位置。
rk[i]表示以第i个字母为起始的后缀的排名。
height[i]数组表示排名为第i的和排名为第i-1的后缀的最长公共前缀长度。

基本思想:
通过倍增思想求出rk[],将rk[]分解为两半,比较第一个,若第一个不同比较第二个。这就是两个关键字的排序,可以通过基数排序,先将原序列按第二关键字排序,在以这个顺序排列第一关键字,这样就保证了第一个不同,小的优先,相同则比较第二关键字。
求解height[]数组的话,有一个性质是height[rk[i]]>=height[rk[i-1]]+1,这样就在做h[rk[i]]的时候利用保存下来的h[rk[i-1]-1省去前面的匹配,直接开始之后的匹配,看能否增长匹配,就可最大线性时间求解。

常用技巧
1.如出现反串之类,可以在原字符串后加入一个不用的字符,将原字符串反过来拼上去做一遍后缀数组。
2.出现重复k次(可重叠)的最长字串,可以二分答案,然后将后缀数组分组,使组里的height都>=mid,判断是否存在一个组的大小>=k。
3.若求得是不可重叠的最长字串,同样二分答案将后缀数组分组,使组里的height都>=k,且每个组里的最大sa-最小sa要>=k,这样就保证了在原串中不会重复。
4…

一波后缀数组小归纳:首先会敲模板,多敲几遍就熟了,后缀数组的作用就是快速求出两个后缀的最长公共前缀,再利用其他主要算法(二分答案…)来求解问题。(R性大佬讲的真好%%%)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值