后缀数组学习笔记

2016-1-1
后缀数组模板练习poj
suffix_sort
求sa的模板在蓝书上
calcuate_height
计算height数组
根据h数组的性质,有height[rank[i]]>=height[rank[i]-1]-1
注意rank[i]=0的情况


[Musical Theme]
题目大意:
给定长度为n(n<=20000)的数列,数字可以经过转调(比如高八调)进行匹配,求可以匹配的最长子串
要求:
1.两个子串不能相交
2.长度大于等于5
3.至少出现2次


题目分析:
我们发现转调比较难处理,但是将数列差分以后就会发现可以匹配的数列是相同的,所以题目转化成了求两个不相交的重复子序列(长度大于等于5)
这个是可以用后缀数组解决的:
将数列进行后缀排序,并求出height数组
因为每个子串都是后缀的前缀
我们发现能匹配最长的区域在sa值相邻的两个后缀之间,这样使他们的LCP最长
所以可以二分答案,将height数组分组,当一个height组里的下标max值和min值的差能使他们不相交的话即为可行




[Power Strings]
题目大意:
将序列分割成(n/L)个子串,要求n/L最大化


题目分析:
1.可以用KMP做,如果(n-fail[n])可以整除n则答案为(n/(n-fail[n])),否则为1
2.要用O(n)的DC3算法也可以做QAQ。。然而10^6数据会卡倍增算法


[Long Long Message]
题目大意:
求两个字符串的最长公共子串


题目分析:
将两个字符串链接,中间用一个'$'符号分割开
后缀排序,如果两个sa值在不同的字符串则可更新答案
for(int i=1;i<n;i++)
  if((sa[i]<n1)^(sa[i-1]<n1))
    ans=max(ans,height[i]);




[Milk Patterns]
题目大意:
求最长可重叠k次的子串


题目分析:
1.后缀排序
2.二分答案
3.height分组
4.一个组中是否存在k个后缀?
(判定完成!)


[Life Forms]
题目大意:
求是否存在子串在超过n/2个不同的串中都出现?


题目分析:
1.将n个串链接起来
2.后缀排序(注意此时的分隔符也可能被误以为是子串输出)
3.二分答案height分组
4.判定是否存在[n/2]+1个串有超过mid的LCP
注意输出不要包含分隔符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值