题目大意:
给出一个长度不超过10^5的字符串求其所有子串当中字典序排行第K(K <= 10^5)的那个
此题对于多个子串相同的视为不同子串,即起点不同也视为不同
大致思路:
刚开始想的是后缀数组的解法, 首先对于这个字符串求后缀数组之后, 利用得到的sa数组的字典序, 因为这里的相同子串要多次计数, 所以对于后缀sa[i]和其他串的LCP也要多次计
于是计数稍微有点麻烦, 需要对每次连续的公共前缀多次计数, 细节见代码
另外是学长做的优先队列的写法:
首先建立优先队列, 其中的元素有两个关键字,分别是当前子串和其后续位置
按照子串的字典序排列之后, 每次抛出一个元素就是字典序最小的, 然后抛出的元素的串加上后续位置后插入优先队列, 继续抛出
第K个出队列的元素的第一关键字即为第K小子串
后缀数组解法:
Result : Accepted Memory : 3600 KB Time : 62 ms
/*
* Author: Gatevin
* Created Time: 2015/2/14 19:36:27
* File Name: Mononobe_Mitsuki.cpp
*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorith