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