hdu5008-Boring String Problem(后缀数组专题)
来源:互联网 发布:形态选股软件 编辑:程序博客网 时间:2024/04/19 23:26
Boring String Problem
题链:http://acm.hdu.edu.cn/showproblem.php?pid=5008
题目就是要将一个字符串所有的子串按照字典序顺序排好后,询问第K个子串(即输出子串的开始和结尾——L && R),当时我就觉得这道题很像后缀数组,因为后缀数组最注重的就是相同前缀,最最典型的就是它是按照字典序排列的!可是,后缀数组会打乱原有的字符串的排列顺序,也就是sa[i]!=i,当时我就迷糊了,现在想来,它主要是这么几个思考步骤:
1.如何求所有子串,还得有序 后缀数组里将所有后缀排序后,每个后缀suffix(i)所产生的不重复后缀个数 = n - sa[i] - height[i] ; 前者 n - sa[i] 是后缀长度,减去重复长度height[i],得到的就是新产生的长度,sub[i] 表示 从第一个后缀到第i个后缀总共产生的子串数(它们都是已经排好序的)
2.如何查询,这是个大问题,以"aaa"为例,如果你查询第0个子串,我们直接查询就会得到答案【3,3】因为在后缀数组里,“a\0” > "aaa\0" 所以说,我们还要处理,处理方法就是在 i - n 里找sa的最小值(设为j)而且他要满足 i-j的公共前缀>=查询子串的长度。用二分查找或是暴力都ok,但是查找第K个子串所在后缀就得用二分,不然会超时。
做题总结:
a) 位运算尽量保证运算是统一的数据类型,而且要注意打括号;
b) 给变量命名,记得不要和系统或者自己已经使用过的变量名重复,也要记得初始化
c)记得杭电用的是I64d!
好开心我开始有意识思考后缀数组了,这证明着我慢慢开始脱离模板思考了
代码如下:
0 0
- hdu5008-Boring String Problem(后缀数组专题)
- hdu5008 Boring String Problem 后缀数组+二分
- hdu5008 Boring String Problem(后缀数组)
- 后缀数组 - hdu5008 Boring String Problem
- hdu5008 Boring String Problem 后缀数组+二分+RMQ
- hdu5008 Boring String Problem,2014西安网络赛B题,后缀数组,RMQ
- HDU5008--Boring String Problem(SA+二分)
- 【后缀数组】 HDOJ 5008 Boring String Problem
- hdu 5008 Boring String Problem(后缀数组)
- HDU 5008 Boring String Problem 后缀数组
- hdu 5008 Boring String Problem(后缀数组)
- hdu 5008 Boring String Problem 【后缀数组】
- hdu 5008 Boring String Problem 后缀数组
- HDU 5008 Boring String Problem 后缀数组
- HDU 5008 Boring String Problem 后缀数组 RMQ
- [后缀数组+二分+rmq] hdu 5008 Boring String Problem
- HDU - 5008 Boring String Problem (后缀数组+二分+RMQ)
- HDU 5008 Boring String Problem 二分 + 后缀数组
- Xcode6的新特性、iPhone6和iPhone6Plus的适配
- hdu 4998 Rotate(几何)
- 21 整数n和m,随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 22 4张红色的牌和4张蓝色的牌。;23 快速的方法计算出下面这个圆形是否和正方形相交
- 归并排序的实现
- hdu5008-Boring String Problem(后缀数组专题)
- easy_install安装和使用
- php操作access数据库
- Apache Camel框架集成Spring
- Advanced Java generics: retreiving generic type arguments
- 小型计算器
- JVM调优总结
- ZOJ-#3622 Magic Number(找规律)
- 常用JS语句100多