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的更多相关文章

  1. SPOJ - SUBLEX 后缀自动机

    SPOJ - SUBLEX 思路:求第k大字串,求出sam上每个节点开始能识别多少字串,然后从起点开始跑就好啦. #include<bits/stdc++.h> #define LL lo ...

  2. SPOJ SUBLEX Lexicographical Substring Search - 后缀数组

    题目传送门 传送门I 传送门II 题目大意 给定一个字符串,多次询问它的第$k$大本质不同的子串,输出它. 考虑后缀Trie.依次考虑每个后缀新增的本质不同的子串个数,显然,它是$n - sa[i] ...

  3. 【spoj SUBLEX】 Lexicographical Substring Search

    http://www.spoj.com/problems/SUBLEX/ (题目链接) 题意 给出一个字符串,询问其中字典序第K小的子串. Solution 后缀自动机例题. 构出后缀自动机以后,对每 ...

  4. spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看

    SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑. 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢. 还有一个 ...

  5. SPOJ SUBLEX 7258. Lexicographical Substring Search

    看起来像是普通的SAM+dfs...但SPOJ太慢了......倒腾了一个晚上不是WA 就是RE ..... 最后换SA写了...... Lexicographical Substring Searc ...

  6. SPOJ SUBLEX - Lexicographical Substring Search 后缀自动机 / 后缀数组

    SUBLEX - Lexicographical Substring Search Little Daniel loves to play with strings! He always finds ...

  7. SPOJ SUBLEX 求第k小子串

    题目大意: 对于一个给定字符串,找到其所有不同的子串中排第k小的子串 先构建后缀自动机,然后我们可以将整个后缀自动机看做是一个DAG图,那么我们先进行拓扑排序得到 *b[N] 对于每个节点记录一个sc ...

  8. 【SPOJ - SUBLEX】Lexicographical Substring Search 【后缀自动机+dp】

    题意 给出一个字符串和q个询问,每个询问给出一个整数k,输出第k大得子串. 分析 建后缀自动机,利用匹配边来解决.设d[v]为从状态v开始有多少不同的路径.这个显然是可以递推出来的.然后对于每个询问, ...

  9. Spoj SUBLEX - Lexicographical Substring Search

    Dicription Little Daniel loves to play with strings! He always finds different ways to have fun with ...

随机推荐

  1. python入门7 字符串操作

    字符串操作 #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 字符串操作 ""&quo ...

  2. 【CF1009F】Dominant Indices(长链剖分优化DP)

    点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先 ...

  3. HDU 5723 最小生成树上的期望

    题意:求最小生成树,和任意两个点之间距离的期望 官方题解: 最后求两遍点的积的时候,还是要判断父子关系. 注意 long long #include <bits/stdc++.h> usi ...

  4. 如何为WebStorm设置SASS的File Watchers?

    Webstorm是一个很牛叉的IDE,现在工作每天都是用它了. 最近开始用SASS,LESS等来写CSS,而在Webstorm中,它自带一个File Watchers功能,设置一下,即可实时编译SAS ...

  5. 二.Mybatis 增删改查

    Student.java package com.pojo; import java.util.Date; public class Student { int stuid; String stuNa ...

  6. 学大伟业 Day 6 培训总结

    今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...

  7. Restframework介绍

    1.REST介绍 REST与技术无关,它代表的是一种软件架构风格,全称Representational State Transfer,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它 ...

  8. B. Train Seats Reservation 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

    You are given a list of train stations, say from the station 1 to the station 100. The passengers ca ...

  9. 最长公共子序列Lcs (51Nod - 1006)

    20180604   11:28   给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,ab ...

  10. harbor中碰到的问题

    harbor部署整体比较简单,但是就是这么简单的东西稍微改变点配置文件就会有不小的问题 1.问题1 部署harbor1.6发现web界面删除的镜像在push一遍上去后,镜像大小为0 且无法删除,这个问 ...