【SPOJ - SUBLEX】Lexicographical Substring Search 【后缀自动机+dp】
题意
给出一个字符串和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 ;
}
【SPOJ - SUBLEX】Lexicographical Substring Search 【后缀自动机+dp】的更多相关文章
- SPOJ SUBLEX - Lexicographical Substring Search 后缀自动机 / 后缀数组
		
SUBLEX - Lexicographical Substring Search Little Daniel loves to play with strings! He always finds ...
 - SP7258 SUBLEX - Lexicographical Substring Search - 后缀自动机,dp
		
给定一个字符串,求本质不同排名第k小的子串 Solution 后缀自动机上每条路径对应一个本质不同的子串 按照 TRANS 图的拓扑序,DP 计算出每个点发出多少条路径 (注意区别 TRANS 图的拓 ...
 - SPOJ 7258 Lexicographical Substring Search [后缀自动机 DP]
		
题意:给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 第一道自己做的1A的SAM啦啦啦 很简单,建SAM后跑kth就行了 也需要按val基数排序倒着 ...
 - spoj 7258 Lexicographical Substring Search (后缀自动机)
		
spoj 7258 Lexicographical Substring Search (后缀自动机) 题意:给出一个字符串,长度为90000.询问q次,每次回答一个k,求字典序第k小的子串. 解题思路 ...
 - SPOJ SUBLEX Lexicographical Substring Search - 后缀数组
		
题目传送门 传送门I 传送门II 题目大意 给定一个字符串,多次询问它的第$k$大本质不同的子串,输出它. 考虑后缀Trie.依次考虑每个后缀新增的本质不同的子串个数,显然,它是$n - sa[i] ...
 - SP7258 SUBLEX - Lexicographical Substring Search(后缀自动机)
		
传送门 解题思路 首先建\(sam\),然后在拓扑序上\(dp\)一下,把每个点的路径数算出来,然后统计答案时就在自动机上\(dfs\)一下,仿照平衡树那样找第\(k\)小. 代码 #include& ...
 - SPOJ7258 SUBLEX - Lexicographical Substring Search(后缀自动机)
		
Little Daniel loves to play with strings! He always finds different ways to have fun with strings! K ...
 - Spoj  SUBLEX - Lexicographical Substring Search
		
Dicription Little Daniel loves to play with strings! He always finds different ways to have fun with ...
 - SPOJ Lexicographical Substring Search 后缀自动机
		
给你一个字符串,然后询问它第k小的factor,坑的地方在于spoj实在是太慢了,要加各种常数优化,字符集如果不压缩一下必t.. #pragma warning(disable:4996) #incl ...
 - spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看
		
SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑. 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢. 还有一个 ...
 
随机推荐
- oracle之 RAC Interconnect之HAIP
			
0. 背景 Oracle 从11.2.0.2开始引入了一个新特性叫做Redundant Interconnect,简称HAIP.HAIP的目的用来代替操作系统级别的网卡绑定以实现Active-Acti ...
 - UOJ #54 时空穿梭 —— 计数+莫比乌斯反演+多项式系数
			
题目:http://uoj.ac/problem/54 10分还要用 Lucas 定理囧...因为模数太小了不能直接算... #include<cstdio> #include<cs ...
 - poj 1637 Sightseeing tour——最大流+欧拉回路
			
题目:http://poj.org/problem?id=1637 先给无向边随便定向,如果一个点的入度大于出度,就从源点向它连 ( 入度 - 出度 / 2 ) 容量的边,意为需要流出去这么多:流出去 ...
 - 安装Zookeeper(单机版)
			
一.解压和重命名 tar -zxvf zookeeper-3.4.8.tar.gz -C /usr/ cd /usr mv zookeeper-3.4.8 zookeeper 二.设置配置文件 cd ...
 - Hadoop的简单序列化框架
			
Hadoop提供了一个加单的序列化框架API,用于集成各种序列化实现.该框架由Serialization实现. 其中Serialization是一个接口,使用抽象工厂的设计模式,提供了一系列和序列化相 ...
 - 【备忘】mysql主从设置
			
主(master)192.168.1.10机器设置: [root@vm-vagrant mysql]# vi my.cnf [mysqld]节点下添加以下配置server-id=1log-bin=my ...
 - DS02--线性表
			
一.PTA实验作业 题目1:线性表元素的区间删除 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 1. 设计思 ...
 - mybatis MySQL返回插入的主键ID,oracle不行
			
<insertid=“doSomething"parameterType="map"useGeneratedKeys="true"keyProp ...
 - 建立SIP通话
			
建立SIP: 点击下的出现的页面: 选择submit,只用填写用户名和密码就OK了,secret是密码,填写完以后记得应用 创建完毕以后,使用xlite去连接:xlite的配置:域名是asterisk ...
 - XML的学习
			
XML是可扩展标记语言德意思,它和HTML一样都是标记语言(标签语言),不同之处在于XML可拓展,何为可拓展?在HTML中每个标签都有其特定的含义,我们不可以随便写一个标签并赋予其意义,而XML中就可 ...