1. /*
  2. 一道在树上乱搞的题目
  3. 建立出parent树来, 然后就能搞出每个节点往后能扩展出几个串, 至于位置不同算同一个的话就强制让right集合大小为1即可
  4. 然后在树上类比权值线段树找第k大26分统计一下即可
  5. */
  6. #include<cstdio>
  7. #include<algorithm>
  8. #include<cstring>
  9. #include<queue>
  10. #include<iostream>
  11. #define ll long long
  12. #define mmp make_pair
  13. #define M 1000100
  14. using namespace std;
  15. int read()
  16. {
  17. int nm = 0, f = 1;
  18. char c = getchar();
  19. for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
  20. for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
  21. return nm * f;
  22. }
  23. int t, k;
  24. char s[M];
  25. int ch[M][26], sz[M], len[M], fa[M], tim[M], a[M], f[M], lst = 1, cnt = 1;
  26. void insert(int c)
  27. {
  28. int p = ++cnt, f = lst;
  29. lst = p;
  30. len[p] = len[f] + 1;
  31. sz[p] = 1;
  32. while(f && !ch[f][c]) ch[f][c] = p, f = fa[f];
  33. if(!f) fa[p] = 1;
  34. else
  35. {
  36. int q = ch[f][c];
  37. if(len[q] == len[f] + 1) fa[p] = q;
  38. else
  39. {
  40. int nq = ++cnt;
  41. memcpy(ch[nq], ch[q], sizeof(ch[q]));
  42. fa[nq] = fa[q];
  43. len[nq] = len[f] + 1;
  44. fa[q] = fa[p] = nq;
  45. while(f && ch[f][c] == q) ch[f][c] = nq, f = fa[f];
  46. }
  47. }
  48. }
  49. void query(int now, int k)
  50. {
  51. if(k <= sz[now]) return;
  52. k -= sz[now];
  53. for(int i = 0; i < 26; i++)
  54. {
  55. if(f[ch[now][i]] < k) k -= f[ch[now][i]];
  56. else
  57. {
  58. putchar('a' + i);
  59. query(ch[now][i], k);
  60. break;
  61. }
  62. }
  63. }
  64. int main()
  65. {
  66. scanf("%s", s + 1);
  67. int l = strlen(s + 1);
  68. for(int i = 1; i <= l; i++) insert(s[i] - 'a');
  69. for(int i = 1; i <= cnt; i++) tim[len[i]]++;
  70. for(int i = 1; i <= cnt; i++) tim[i] += tim[i - 1];
  71. for(int i = 1; i <= cnt; i++) a[tim[len[i]]--] = i;
  72. for(int i = cnt; i >= 1; i--) sz[fa[a[i]]] += sz[a[i]];
  73. t = read(), k = read();
  74. if(t == 0) for(int i = 1; i <= cnt; i++) f[i] = sz[i] = 1;
  75. else for(int i = 1; i <= cnt; i++) f[i] = sz[i];
  76. f[1] = sz[1] = 0;
  77. for(int i = cnt; i >= 1; i--)
  78. {
  79. for(int j = 0; j < 26; j++)
  80. {
  81. f[a[i]] += f[ch[a[i]][j]];
  82. }
  83. }
  84. if(k > f[1]) return 0 * puts("-1");
  85. else query(1, k);
  86. return 0;
  87. }

[TJOI2015]弦论(后缀自动机)的更多相关文章

  1. 【BZOJ3998】[TJOI2015]弦论 后缀自动机

    [BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...

  2. BZOJ 3998: [TJOI2015]弦论 [后缀自动机 DP]

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2152  Solved: 716[Submit][Status] ...

  3. [bzoj3998][TJOI2015]弦论-后缀自动机

    Brief Description 给定一个字符串, 您需要求出他的严格k小子串或非严格k小子串. Algorithm Design 考察使用后缀自动机. 首先原串建SAM, 然后如果考察每个状态代表 ...

  4. BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串

    http://www.lydsy.com/JudgeOnline/problem.php?id=3998 后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串 ...

  5. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  6. 【bzoj3998】[TJOI2015]弦论 后缀自动机+dp

    题目描述 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个.T=1则表示不同位置 ...

  7. BZOJ 3998 [TJOI2015]弦论 ——后缀自动机

    直接构建后缀自动机. 然后. 然后只需要再后缀自动机的go树上类似二分的方法进行查找即可,实际上是“26分”. 然后遇到了处理right集合的问题,然后觉得在go和parent树上上传都是可以的,毕竟 ...

  8. BZOJ.3998.[TJOI2015]弦论(后缀自动机)

    题目链接 \(Description\) 给定字符串S,求其第K小子串.(若T=0,不同位置的相同子串算1个:否则算作多个) \(Solution\) 建SAM,处理出对于每个节点,它和它的所有后继包 ...

  9. bzoj 3998 [TJOI2015]弦论——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3998 相同子串算多个的话,先求好 right ,然后求一个 sm 表示走到这个点之后有几种走 ...

随机推荐

  1. 将 vue 挂在 window 对象上,实现能调用 elementUI 的组件

    html 部分: <div id="sample"> </div> js 部分(将js代码放在 body 的 onload事件中: <body onl ...

  2. bzoj 4184 shallot——线段树分治+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...

  3. Eclipse设置自动提示(转)

    一.Eclipse编辑Spring配置文件xml时自动提示类class包名 链接:http://blog.csdn.net/hh775313602/article/details/70176531 第 ...

  4. java -jar 执行jar包出现 java.lang.NoClassDefFoundError

    我用idea工具将自己开发java程序打成一个可执行的jar包,当然用eclipse或者直接用jar命令行都无所谓,本质都是将程序归档到一个压缩包,并附带一个说明清单文件. 打jar的操作其实很简单, ...

  5. google浏览器查看源码快捷键 ctrl+U

    google浏览器查看源码快捷键 ctrl+U 或则在地址栏的网址前加上:view-source:

  6. java强制删除文件机制

    //启动资源强制回收机制 System.gc(); 然后就可以删除了

  7. mig_7series DDR控制器的配置

    mig_7series DDR控制器的配置

  8. JAVA常量与变量

    顺着箭头的转换为自动转换逆这箭头的转换为强制转换. 常量 关键字FINAL 命名为大写 标识符 1要以字母数字下划线和¥组成 2首字母不能为数字 3不能是JAVA的关键字和 保留字 4数据类型分为基本 ...

  9. springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)

    在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...

  10. C语言强化——字符串(1)

    实现 mystrcpy(), mystrcmp(), mystrcat(), mystrlen() ; #include<stdio.h> void mystrcpy(char *i,ch ...