题意

给出一个字符串和q个询问,每个询问给出一个整数k,输出第k大得子串。

分析

建后缀自动机,利用匹配边来解决。设d[v]为从状态v开始有多少不同的路径。这个显然是可以递推出来的。然后对于每个询问,根据d[v]来选择走哪个状态就可以了。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=2e5+;
char s[maxn];
struct state{
int link,len;
int next[];
}st[*maxn];
int d[*maxn];
int n,last,cur,sz,Q;
void init(){
sz=;
last=cur=;
st[].link=-;
st[].len=;
} void build_sam(int c){
cur=sz++;
st[cur].len=st[last].len+;
int p;
for(p=last;p!=-&&st[p].next[c]==;p=st[p].link)
st[p].next[c]=cur;
if(p==-)
st[cur].link=;
else{
int q=st[p].next[c];
if(st[q].len==st[p].len+)
st[cur].link=q;
else{
int clone=sz++;
st[clone].len=st[p].len+;
st[clone].link=st[q].link;
for(int i=;i<;i++)
st[clone].next[i]=st[q].next[i];
for(;p!=-&&st[p].next[c]==q;p=st[p].link)
st[p].next[c]=clone;
st[cur].link=st[q].link=clone;
}
}
last=cur;
}
int c[*maxn];
int cmp(int a,int b){
return st[a].len>st[b].len;
}
void dp(){
for(int i=;i<sz;i++)
c[i]=i;
sort(c,c+sz,cmp );
for(int i=;i<sz;i++){
int o=c[i];
d[o]=;
for(int j=;j<;j++){
int v=st[o].next[j];;
if(v)
d[o]+=d[v];
}
}
} int main(){
scanf("%s",s);
n=strlen(s);
init();
for(int i=;i<n;i++){
int c=s[i]-'a';
build_sam(c);
}
dp();
scanf("%d",&Q);
for(int q=;q<=Q;q++){
int k,u=;
scanf("%d",&k);
while(k>){
for(int i=;i<;i++){
int v=st[u].next[i];
if(v){
if(k>d[v])
k-=d[v];
else{
k--;
printf("%c",'a'+i);
u=v;
break;
}
}
}
}
printf("\n");
}
return ;
}

最新文章

  1. Ajax_05之跨域请求
  2. 写给自己的Java程序员学习路线图
  3. Android上使用MP3格式录制声音
  4. [转]position:relative leaves an empty space
  5. 手把手教你入门mac idea
  6. WPF FindName()查找命名注册的元素
  7. 我的MYSQL学习心得(十一)
  8. SQL点滴22—性能优化没有那么神秘
  9. 类中的两大类(string类、math类)的应用
  10. 国内阿里Maven仓库镜像及自己收集镜像库
  11. [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
  12. Mac实用操作技巧(六)
  13. python爬虫小说代码,可用的
  14. Spring PropertyResolver 占位符解析(二)源码分析
  15. git合并的时候,冲突问题Merging is not possible because you have unmerged files
  16. 笔记六:python字符串运算与函数
  17. 一次查找Windows Live Writer的VSPaste插件丢失RTF格式信息的经历
  18. 润乾V4的最小化部署方式
  19. 【转载】pycharm常用快捷键
  20. Objective-C学习笔记(四)——OC实现最简单的数学运算

热门文章

  1. lua中的数学库
  2. [Oracle] CPU/PSU补丁安装详细教程
  3. c# 启动关闭sql服务
  4. 初识php,开发环境的配置
  5. GNU Radio: 自定义 block 实例
  6. 使用exe4j把java程序生成可执行的.exe文件
  7. PyQt 5的基本功能
  8. 5月3日上课笔记-XML解析
  9. Oracle重建临时表空间
  10. Julia - 复合表达式