SPOJ - SUBLEX

思路:求第k大字串,求出sam上每个节点开始能识别多少字串,然后从起点开始跑就好啦。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define PII pair<int, int>
  7. #define PLI pair<LL, int>
  8. #define PDD pair<double,double>
  9. #define ull unsigned long long
  10. using namespace std;
  11.  
  12. const int N = + ;
  13. const int inf = 0x3f3f3f3f;
  14. const LL INF = 0x3f3f3f3f3f3f3f3f;
  15. const int mod = 1e9 + ;
  16. const double eps = 1e-;
  17.  
  18. int n, ans[N];
  19. LL dp[N << ];
  20. char s[N];
  21.  
  22. struct SuffixAutomaton {
  23. int last, cur, cnt, ch[N<<][], id[N<<], fa[N<<], dis[N<<], sz[N<<], c[N];
  24. SuffixAutomaton() {cur = cnt = ;}
  25. void init() {
  26. for(int i = ; i <= cnt; i++) {
  27. memset(ch[i], , sizeof(ch[i]));
  28. sz[i] = c[i] = dis[i] = fa[i] = ;
  29. }
  30. cur = cnt = ;
  31. }
  32. void extend(int c, int id) {
  33. last = cur; cur = ++cnt;
  34. int p = last; dis[cur] = id;
  35. for(; p && !ch[p][c]; p = fa[p]) ch[p][c] = cur;
  36. if(!p) fa[cur] = ;
  37. else {
  38. int q = ch[p][c];
  39. if(dis[q] == dis[p]+) fa[cur] = q;
  40. else {
  41. int nt = ++cnt; dis[nt] = dis[p]+;
  42. memcpy(ch[nt], ch[q], sizeof(ch[q]));
  43. fa[nt] = fa[q]; fa[q] = fa[cur] = nt;
  44. for(; ch[p][c]==q; p=fa[p]) ch[p][c] = nt;
  45. }
  46. }
  47. sz[cur] = ;
  48. }
  49. void getSize(int n) {
  50. for(int i = ; i <= cnt; i++) c[dis[i]]++;
  51. for(int i = ; i <= n; i++) c[i] += c[i-];
  52. for(int i = cnt; i >= ; i--) id[c[dis[i]]--] = i;
  53. for(int i = cnt; i >= ; i--) {
  54. int p = id[i];
  55. sz[fa[p]] += sz[p];
  56. }
  57. }
  58. void work(int u, int k) {
  59. if(!k) return;
  60. LL ret = ;
  61. for(int i = ; i < ; i++) {
  62. if(!ch[u][i]) continue;
  63. if(ret + dp[ch[u][i]] + >= k) {
  64. putchar(i + 'a');
  65. work(ch[u][i], k - ret - );
  66. break;
  67. }
  68. ret += dp[ch[u][i]] + ;
  69. }
  70. }
  71. void solve() {
  72. for(int i = cnt; i >= ; i--) {
  73. int u = id[i]; dp[u] = ;
  74. for(int c = ; c < ; c++)
  75. if(ch[u][c]) dp[u] += dp[ch[u][c]] + ;
  76. }
  77. int q, k; scanf("%d", &q);
  78. while(q--) {
  79. scanf("%d", &k);
  80. work(, k);
  81. puts("");
  82. }
  83. }
  84. } sam;
  85.  
  86. int main() {
  87. scanf("%s", s + );
  88. n = strlen(s + );
  89. for(int i = ; i <= n; i++)
  90. sam.extend(s[i]-'a', i), ans[i] = ;
  91. sam.getSize(n);
  92. sam.solve();
  93. return ;
  94. }
  95.  
  96. /*
  97. */

SPOJ - SUBLEX 后缀自动机的更多相关文章

  1. SPOJ NSUBSTR (后缀自动机)

    SPOJ NSUBSTR Problem : 给一个长度为n的字符串,要求分别输出长度为1~n的子串的最多出现次数. Solution :首先对字符串建立后缀自动机,在根据fail指针建立出后缀树,对 ...

  2. SPOJ LCS 后缀自动机

    用后缀自动机求两个长串的最长公共子串,效果拔群.多样例的时候memset要去掉. 解题思路就是跟CLJ的一模一样啦. #pragma warning(disable:4996) #include< ...

  3. SPOJ - LCS 后缀自动机入门

    LCS - Longest Common Substring A string is finite sequence of characters over a non-empty finite set ...

  4. SPOJ LCS 后缀自动机找最大公共子串

    这里用第一个字符串构建完成后缀自动机以后 不断用第二个字符串从左往右沿着后缀自动机往前走,如能找到,那么当前匹配配数加1 如果找不到,那么就不断沿着后缀树不断往前找到所能匹配到当前字符的最大长度,然后 ...

  5. SPOJ 7258 (后缀自动机)

    转载:http://hzwer.com/4492.html 给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 搞出后缀自动机 dp处理出每个点往下走能 ...

  6. 长度为x的本质不同的串的出现次数 SPOJ - NSUBSTR 后缀自动机简单应用

    题意: 长度为x的本质不同的串的出现次数 题解: 先处理出每一个节点所对应的子串出现的次数 然后取max就好了 #include <set> #include <map> #i ...

  7. 多个串的最长公共子串 SPOJ - LCS2 后缀自动机

    题意: 求多个串的最长公共子串 这里用的是O(n)的后缀自动机写法 我后缀数组的专题有nlog(n)写法的 题解: 对于其中的一个串建立后缀自动机 然后对于后缀自动机上面的每一个节点求出每一个节点最长 ...

  8. Spoj REPEATS 后缀自动机+set

    REPEATS - Repeats 链接:http://www.spoj.com/problems/REPEATS 题意:求S串中某个子串连续循环次数最多的次数. 想法: 从暴力开始,枚举所有串,求出 ...

  9. SPOJ - NSUBSTR 后缀自动机板子

    SPOJ - NSUBSTR #include<bits/stdc++.h> #define LL long long #define fi first #define se second ...

随机推荐

  1. bzoj 3309 反演

    $n=p_1^{a_1}p_2^{a_2}…p_k^{a_k},p_i$为素数,定义$f(n)=max(a_1,a_2…,a_k)$. 给定a,b<=1e7求$\sum\limits_{i=1} ...

  2. Java并发编程原理与实战三十七:线程池的原理与使用

    一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExe ...

  3. 1.phpcms的安装和卸载文件

    一.安装文件 ①languages文件夹 语言包:zh-cn\order.lang.php //样式<?php $LANG['order_new'] = '订单管理'; ?> ②templ ...

  4. 【leetcode 简单】 第六十六题 用栈实现队列

    使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是否为空. ...

  5. Mysql 关闭自动commit

    更多内容推荐微信公众号,欢迎关注: 1. 会话级关闭自动提交 mysql> set autocommit=off; Query OK, 0 rows affected (0.00 sec) my ...

  6. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  7. 【译】第九篇 Integration Services:控制流任务错误

    本篇文章是Integration Services系列的第九篇,详细内容请参考原文. 简介在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentE ...

  8. node.js 开发环境搭建

    node.js下载地址 https://nodejs.org/download/ windows系统建议下载 msi 安装完成配置环境变量(根据安装路径来) NODE_PATH=C:\Program ...

  9. [Openwrt 扩展下篇] Openwrt搭建私有云Owncloud 9

    网上很多资料讲用Linux打造owncloud构建私有云 ,花了些时间研究了下,我将之前的需求打造成了Openwrt下的Owncloud 9.其实网上还有Seafile.大家对比来看下知乎的评论,其实 ...

  10. Go net/http获取body中json格式数据

    Go net/http获取body中json格式数据 package main import ( "encoding/json" "fmt" "io/ ...