SPOJ SUBLEX
SUBLEX - Lexicographical Substring Search
题意
求第k小的子串。相同的算一个。
分析
建立后缀自动机,在后缀自动机上从一个点经过trans,到另一个点,trans会对应一个子串。而且会对应所有的子串。
每个节点能经过trans到达的点,即它可以形成的子串。所有按照拓扑序更新每个节点能形成多少个子串,如果经过当前点形成的串小于k,那么说明第k小的串不经过高这个点,k-=siz,继续找,如果小于这个的siz,那么就经过这个点,输出。有点像二叉搜索树的查询。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for (;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; struct SuffixAutomaton{
int Last, Index, fa[N], len[N], trans[N][];
int v[N],sa[N],siz[N];
char s[N];
void extend(int c) {
int P = Last, NP = ++Index;
len[NP] = len[P] + ;
for (; P&&!trans[P][c]; P=fa[P]) trans[P][c] = NP;
if (!P) fa[NP] = ;
else {
int Q = trans[P][c];
if (len[P] + == len[Q]) fa[NP] = Q;
else {
int NQ = ++Index;
fa[NQ] = fa[Q];
len[NQ] = len[P] + ;
memcpy(trans[NQ], trans[Q], sizeof trans[Q]);
fa[Q] = NQ;
fa[NP] = NQ;
for (; P&&trans[P][c]==Q; P=fa[P]) trans[P][c] = NQ;
}
}
Last = NP;
}
void build() {
Last = Index = ; //---老是忘记这里。。。
scanf("%s",s+);
int n = strlen(s+);
for (int i=; i<=n; ++i) extend(s[i] - 'a');
for (int i=; i<=Index; ++i) v[len[i]] ++;
for (int i=; i<=n; ++i) v[i] += v[i-];
for (int i=; i<=Index; ++i) sa[ v[len[i]]-- ] = i;
} void init() {
for (int i=Index; i>=; --i) {
int t = sa[i];
siz[t] ++;
for (int j=; j<; ++j) {
if (trans[t][j]) siz[t] += siz[trans[t][j]];
}
}
}
void query(int k) {
int p = ;
while (k)
for (int i=; i<; ++i)
if (trans[p][i])
if (k > siz[trans[p][i]]) k -= siz[trans[p][i]];
else {
printf("%c",i+'a');
p = trans[p][i];
k--;
break;
}
}
void solve() {
build();
init();
int m = read(),k;
while (m--) {
k = read();
query(k);
puts("");
}
}
}sam; int main() {
sam.solve();
return ;
}
SPOJ SUBLEX的更多相关文章
- SPOJ - SUBLEX  后缀自动机
		
SPOJ - SUBLEX 思路:求第k大字串,求出sam上每个节点开始能识别多少字串,然后从起点开始跑就好啦. #include<bits/stdc++.h> #define LL lo ...
 - SPOJ SUBLEX Lexicographical Substring Search - 后缀数组
		
题目传送门 传送门I 传送门II 题目大意 给定一个字符串,多次询问它的第$k$大本质不同的子串,输出它. 考虑后缀Trie.依次考虑每个后缀新增的本质不同的子串个数,显然,它是$n - sa[i] ...
 - 【spoj SUBLEX】 Lexicographical Substring Search
		
http://www.spoj.com/problems/SUBLEX/ (题目链接) 题意 给出一个字符串,询问其中字典序第K小的子串. Solution 后缀自动机例题. 构出后缀自动机以后,对每 ...
 - spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看
		
SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑. 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢. 还有一个 ...
 - SPOJ SUBLEX 7258. Lexicographical Substring Search
		
看起来像是普通的SAM+dfs...但SPOJ太慢了......倒腾了一个晚上不是WA 就是RE ..... 最后换SA写了...... Lexicographical Substring Searc ...
 - SPOJ SUBLEX - Lexicographical Substring Search 后缀自动机 / 后缀数组
		
SUBLEX - Lexicographical Substring Search Little Daniel loves to play with strings! He always finds ...
 - SPOJ SUBLEX 求第k小子串
		
题目大意: 对于一个给定字符串,找到其所有不同的子串中排第k小的子串 先构建后缀自动机,然后我们可以将整个后缀自动机看做是一个DAG图,那么我们先进行拓扑排序得到 *b[N] 对于每个节点记录一个sc ...
 - 【SPOJ - SUBLEX】Lexicographical Substring Search 【后缀自动机+dp】
		
题意 给出一个字符串和q个询问,每个询问给出一个整数k,输出第k大得子串. 分析 建后缀自动机,利用匹配边来解决.设d[v]为从状态v开始有多少不同的路径.这个显然是可以递推出来的.然后对于每个询问, ...
 - Spoj  SUBLEX - Lexicographical Substring Search
		
Dicription Little Daniel loves to play with strings! He always finds different ways to have fun with ...
 
随机推荐
- python入门23 pymssql模块(python连接sql server增删改数据 )
			
增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 ''' dinghanhua sql server增删改 ''' import py ...
 - 高通Vuforia
			
这里使用高通的Vuroria来做一个AR歌姬. 工具: Vuforia,MMD4Mecanim 模型: 初音未来pmd模型文件,极乐净土vmd动作文件. 逻辑: 当发现识别卡时:开启音乐,模型速度为1 ...
 - JavaEE权限管理系统的搭建(四)--------使用拦截器实现登录认证和apache shiro密码加密
			
RBAC 基于角色的权限访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个 ...
 - 学习Node.js知识小结
			
什么是Node.js 官方解释:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js使用了一个事件驱动.非阻塞式I/O的模型( Node.js的特性 ...
 - Vue nodejs商城-地址模块
			
一.地址列表渲染 ,则不可以点击. src/views/Cart.vue <a class="btn btn--red" v-bind:class="{'btn-- ...
 - js中实现页面跳转(返回前一页、后一页)
			
一:JS 重载页面,本地刷新,返回上一页 代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a ...
 - 菜鸟崛起 DB Chapter 2 MySQL 5.6的概述与安装
			
在上文菜鸟崛起 DB Chapter 1 数据库概述我们初步认识了数据库,也知道市面上常见的几种数据库,下面我们就针对常见的MySQL数据库展开对DataBase的探讨. 2.1 MySQL介绍 M ...
 - Angularjs基础(七)
			
AngularJS表单 AngularJS表单时输入控件的集合HTML控件 一下HTML input 元素被称为HTML 控件: input 元素 select元素 button元素 textarea ...
 - ABAP术语-Event
			
Event 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/31/1059588.html Occurrence of a change of ...
 - php判断某个数是素数的3种方法
			
什么是素数? 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数.(注:1不是素数.) 方法一: 基本方法,——计数方法. $num = 7; $n = ...