SUBLEX - Lexicographical Substring Search

链接

题意

  求第k小的子串。相同的算一个。

分析

  建立后缀自动机,在后缀自动机上从一个点经过trans,到另一个点,trans会对应一个子串。而且会对应所有的子串。

  每个节点能经过trans到达的点,即它可以形成的子串。所有按照拓扑序更新每个节点能形成多少个子串,如果经过当前点形成的串小于k,那么说明第k小的串不经过高这个点,k-=siz,继续找,如果小于这个的siz,那么就经过这个点,输出。有点像二叉搜索树的查询。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4.  
  5. inline int read() {
  6. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  7. for (;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  8. }
  9.  
  10. const int N = ;
  11.  
  12. struct SuffixAutomaton{
  13. int Last, Index, fa[N], len[N], trans[N][];
  14. int v[N],sa[N],siz[N];
  15. char s[N];
  16. void extend(int c) {
  17. int P = Last, NP = ++Index;
  18. len[NP] = len[P] + ;
  19. for (; P&&!trans[P][c]; P=fa[P]) trans[P][c] = NP;
  20. if (!P) fa[NP] = ;
  21. else {
  22. int Q = trans[P][c];
  23. if (len[P] + == len[Q]) fa[NP] = Q;
  24. else {
  25. int NQ = ++Index;
  26. fa[NQ] = fa[Q];
  27. len[NQ] = len[P] + ;
  28. memcpy(trans[NQ], trans[Q], sizeof trans[Q]);
  29. fa[Q] = NQ;
  30. fa[NP] = NQ;
  31. for (; P&&trans[P][c]==Q; P=fa[P]) trans[P][c] = NQ;
  32. }
  33. }
  34. Last = NP;
  35. }
  36. void build() {
  37. Last = Index = ; //---老是忘记这里。。。
  38. scanf("%s",s+);
  39. int n = strlen(s+);
  40. for (int i=; i<=n; ++i) extend(s[i] - 'a');
  41. for (int i=; i<=Index; ++i) v[len[i]] ++;
  42. for (int i=; i<=n; ++i) v[i] += v[i-];
  43. for (int i=; i<=Index; ++i) sa[ v[len[i]]-- ] = i;
  44. }
  45.  
  46. void init() {
  47. for (int i=Index; i>=; --i) {
  48. int t = sa[i];
  49. siz[t] ++;
  50. for (int j=; j<; ++j) {
  51. if (trans[t][j]) siz[t] += siz[trans[t][j]];
  52. }
  53. }
  54. }
  55. void query(int k) {
  56. int p = ;
  57. while (k)
  58. for (int i=; i<; ++i)
  59. if (trans[p][i])
  60. if (k > siz[trans[p][i]]) k -= siz[trans[p][i]];
  61. else {
  62. printf("%c",i+'a');
  63. p = trans[p][i];
  64. k--;
  65. break;
  66. }
  67. }
  68. void solve() {
  69. build();
  70. init();
  71. int m = read(),k;
  72. while (m--) {
  73. k = read();
  74. query(k);
  75. puts("");
  76. }
  77. }
  78. }sam;
  79.  
  80. int main() {
  81. sam.solve();
  82. return ;
  83. }

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. Android(java)学习笔记2:继承Thread类创建线程类

    1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...

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

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

  3. redis未授权访问getshell

    redis未授权访问的问题一年前就爆了,当时刚开始学安全,还不太懂.今天借着工作的机会来搞一把,看看能不能拿下一台服务器.其实前几天就写好了一直想找个实际环境复现一下,一直没有找到,只说下大致思路. ...

  4. 【luogu P2764 最小路径覆盖问题】 模板

    题目链接:https://www.luogu.org/problemnew/show/P2764 把每个点在左边建一遍右边建一遍,再加上源点汇点,跑最大流,n-最大流就是答案. #include &l ...

  5. Redis集群整合到springboot框架

    整合步骤 1 配置application.properties spring.redis.cluster.nodes=192.168.60.131:8000,192.168.60.131:8001,1 ...

  6. Openresty最佳案例 | 第4篇:OpenResty常见的api

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616660 本文出自方志朋的博客 获取请求参数 vim /usr/example/exa ...

  7. property--name--id-这三者在值传递的过程中的实现关系

    作者:light链接:https://www.zhihu.com/question/286739416/answer/454300180来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  8. dcm4che 的依赖无法下载

    遇到问题时我在Gradle这样引入 maven { url "http://www.dcm4che.org/maven2"} 这样使用可以解决问题 maven { url &quo ...

  9. 转载:Spring使用p名称空间配置属性

    这篇博客简明扼要地介绍了Spring中p命名空间的使用,笔者在此转载一下. 原文链接:https://blog.csdn.net/liaomin416100569/article/details/49 ...

  10. Python实现trim函数

    Python中其实也有类似Java的trim函数的,叫做strip,举例: #!/usr/bin/python # -*- coding: UTF-8 -*- str = "0000000h ...