2014西安网络预选赛1002(后缀数组求第K大的子串)hdu5008
2014-09-14 23:58
471 查看
Boring String Problem
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 272 Accepted Submission(s): 65
Problem Description
In this problem, you are given a string s and q queries.
For each query, you should answer that when all distinct substrings of string s were sorted lexicographically, which one is the k-th smallest.
A substring si...j of the string s = a1a2 ...an(1 ≤ i ≤ j ≤ n) is the string aiai+1 ...aj. Two substrings sx...y and sz...w are cosidered to be distinct if sx...y ≠
Sz...w
Input
The input consists of multiple test cases.Please process till EOF.
Each test case begins with a line containing a string s(|s| ≤ 105) with only lowercase letters.
Next line contains a postive integer q(1 ≤ q ≤ 105), the number of questions.
q queries are given in the next q lines. Every line contains an integer v. You should calculate the k by k = (l⊕r⊕v)+1(l, r is the output of previous question, at the beginning of each case l = r = 0, 0 < k < 263, “⊕” denotes exclusive or)
Output
For each test case, output consists of q lines, the i-th line contains two integers l, r which is the answer to the i-th query. (The answer l,r satisfies that sl...r is the k-th smallest and if there are several l,r available, ouput l,r which with
the smallest l. If there is no l,r satisfied, output “0 0”. Note that s1...n is the whole string)
Sample Input
aaa 4 0 2 3 5
Sample Output
1 1 1 3 1 2 0 0
题意:找出第k大的子串,有多种情况要取l最小的一个
思路:比赛的时候看完题目以后大概知道是后缀数组,就没细想了,因为还有其它过的人更多的题没做出来= =
首先注意后缀数组可以求出到第i个后缀一共有多少种不同的子串
先不考虑前面的影响,而第i个后缀不同的子串的个数就等于在该后缀上找前缀的个数,就等于该后缀的长度,即cnt=n-sa[i]
而这个cnt是包含了与上一个名次的后缀前面一样的串的个数,所以还要减去这部分(恰好等于height[i]),即cnt=cnt - height[i]
然后对于查询,只需要二分找到第一个满足的sa[i],那么就可以从sa[i]开始往后枚举最小的下标,因为后面可能存在一样的串且下标更小
相关文章推荐
- hdu5008 Boring String Problem,2014西安网络赛B题,后缀数组,RMQ
- HDU 5008西安网络赛B题:后缀数组求第k小子串
- 2014西安网络预选赛1009(矩阵快速幂)hdu5015
- 利用后缀数组 前缀 LCP最长公共前缀求第K大的子串
- 2014西安网络预选赛1003(DP+剪枝)hdu5009
- hdu5008(后缀数组求第k小的字串)
- 后缀数组(2014西安网络赛)hdu5008
- 2014西安网络预选赛1009(点分治)HDU5016
- A new common sub-strings problem(后缀数组,求第K小公共子串)
- poj 3261 Milk Patterns 后缀数组 最长重复子串
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 【后缀数组求不可重叠最长重复子串】POJ 1743
- 【后缀数组求重复次数最多的连续重复子串】SPOJ687 POJ3693
- 【后缀数组求最长回文子串】POJ 3974
- 实用算法实现-第 8 篇 后缀树和后缀数组 [4 最长回文子串]
- POJ1743 Musical Theme,后缀数组,最长重复不重叠子串,二分检索答案
- 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 实用算法实现-第 8 篇 后缀树和后缀数组 [4 最长回文子串]
- poj 2774 后缀数组 最长公共子串
- 实用算法实现-第 8 篇 后缀树和后缀数组 [2 最长公共子串]