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 ...
随机推荐
- Android(java)学习笔记2:继承Thread类创建线程类
1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...
- HDU 5723 最小生成树上的期望
题意:求最小生成树,和任意两个点之间距离的期望 官方题解: 最后求两遍点的积的时候,还是要判断父子关系. 注意 long long #include <bits/stdc++.h> usi ...
- redis未授权访问getshell
redis未授权访问的问题一年前就爆了,当时刚开始学安全,还不太懂.今天借着工作的机会来搞一把,看看能不能拿下一台服务器.其实前几天就写好了一直想找个实际环境复现一下,一直没有找到,只说下大致思路. ...
- 【luogu P2764 最小路径覆盖问题】 模板
题目链接:https://www.luogu.org/problemnew/show/P2764 把每个点在左边建一遍右边建一遍,再加上源点汇点,跑最大流,n-最大流就是答案. #include &l ...
- Redis集群整合到springboot框架
整合步骤 1 配置application.properties spring.redis.cluster.nodes=192.168.60.131:8000,192.168.60.131:8001,1 ...
- Openresty最佳案例 | 第4篇:OpenResty常见的api
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616660 本文出自方志朋的博客 获取请求参数 vim /usr/example/exa ...
- property--name--id-这三者在值传递的过程中的实现关系
作者:light链接:https://www.zhihu.com/question/286739416/answer/454300180来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- dcm4che 的依赖无法下载
遇到问题时我在Gradle这样引入 maven { url "http://www.dcm4che.org/maven2"} 这样使用可以解决问题 maven { url &quo ...
- 转载:Spring使用p名称空间配置属性
这篇博客简明扼要地介绍了Spring中p命名空间的使用,笔者在此转载一下. 原文链接:https://blog.csdn.net/liaomin416100569/article/details/49 ...
- Python实现trim函数
Python中其实也有类似Java的trim函数的,叫做strip,举例: #!/usr/bin/python # -*- coding: UTF-8 -*- str = "0000000h ...