直接构建后缀自动机。

然后

然后只需要再后缀自动机的go树上类似二分的方法进行查找即可,实际上是“26分”。

然后遇到了处理right集合的问题,然后觉得在go和parent树上上传都是可以的,毕竟一个是向后添加(go),而另一个是向前添加(parent),然后计算出来之后就类似平衡树的查找方式进行查找即可。

然后就A掉了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define F(i,j,k) for (int i=j;i<=k;++i)
  8. #define D(i,j,k) for (int i=j;i>=k;--i)
  9. #define maxn 1000005
  10.  
  11. struct SuffixAuto{
  12. char s[maxn];
  13. int last,cnt,t,k,len,v[maxn],q[maxn],rit[maxn];
  14. int l[maxn],go[maxn][26],fa[maxn],sum[maxn];
  15. void init()
  16. {
  17. memset(go,0,sizeof go);
  18. last=cnt=1;
  19. }
  20. void add(int x)
  21. {
  22. int p=last,np=last=++cnt; l[np]=l[p]+1; rit[np]=1;
  23. for (;p&&!go[p][x];p=fa[p]) go[p][x]=np;
  24. if (!p) fa[np]=1;
  25. else
  26. {
  27. int q=go[p][x];
  28. if (l[q]==l[p]+1) fa[np]=q;
  29. else
  30. {
  31. int nq=++cnt;
  32. l[nq]=l[p]+1;
  33. memcpy(go[nq],go[q],sizeof go[q]);
  34. fa[nq]=fa[q];
  35. fa[q]=fa[np]=nq;
  36. for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
  37. }
  38. }
  39. }
  40. void build()
  41. {
  42. scanf("%s",s+1); len=strlen(s+1);
  43. F(i,1,len) add(s[i]-'a');
  44. scanf("%d%d",&t,&k);
  45. F(i,1,cnt) v[l[i]]++;
  46. F(i,1,len) v[i]+=v[i-1];
  47. D(i,cnt,1) q[v[l[i]]--]=i;
  48. D(i,cnt,1)
  49. {
  50. int tmp=q[i];
  51. if (t) rit[fa[tmp]]+=rit[tmp];
  52. else rit[tmp]=1;
  53. }
  54. rit[1]=0;
  55. D(i,cnt,1)
  56. {
  57. int tmp=q[i];
  58. sum[tmp]=rit[tmp];
  59. F(j,0,25) sum[tmp]+=sum[go[tmp][j]];
  60. }
  61. }
  62. void dfs(int o,int x)
  63. {
  64. if (x<=rit[o]) return ;
  65. x-=rit[o];
  66. F(i,0,25)
  67. if (go[o][i]){
  68. if (x>sum[go[o][i]]) x-=sum[go[o][i]];
  69. else
  70. {
  71. printf("%c",'a'+i);
  72. dfs(go[o][i],x);
  73. return;
  74. }
  75. }
  76. }
  77. void solve()
  78. {
  79. if (k>sum[1]) printf("-1\n");
  80. else dfs(1,k);
  81. }
  82. }sam;
  83.  
  84. int main()
  85. {
  86. sam.init();
  87. sam.build();
  88. sam.solve();
  89. }

  

BZOJ 3998 [TJOI2015]弦论 ——后缀自动机的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    传送门 解题思路 \(T=0\)时就和SP7258一样,\(T=1\)时其实也差不多,只不过要把每个点原来是\(1\)的权值改为\(Right\)集合的大小. 代码 #include<iostr ...

  7. ●BZOJ 3998 [TJOI2015]弦论

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3998题解: 后缀自动机. 当T=0时, 由于在后缀自动机上沿着trans转移,每个串都是互不 ...

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

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

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

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

随机推荐

  1. ExpandableListView 安卓二级菜单

    ExpandableListView可以显示一个视图垂直滚动显示两级列表中的条目,这不同于列表视图(ListView).ExpandableListView允许有两个层次:一级列表中有二级列表.比如在 ...

  2. Android 检查内存溢出

    工具网址:https://github.com/square/leakcanary 中文版说明地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read ...

  3. # iOS Block的本质(三)

    iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...

  4. 分布式定时任务的redis锁实现

    一个web项目如果部署为分布式时,平时常见的定时服务在一定的间隔时间内,可能出现多次重复调用的问题.而此时由于是不同容器之间的竞争,因此需要容器级别的锁 Redis为单进程单线程模式,采用队列模式将并 ...

  5. MySQL 导出一句话

    听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...

  6. JAVA的程序基本结构和数据类型

    //源程序 Hello.java public class Hello { static String str ="Hello World"; public static void ...

  7. 洛谷 P1531 I Hate It

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  8. Navicat 复制多条数据

  9. C# 文件操作的工具类

    using System.IO; namespace 文件操作类 { public class FileHelper { /// <summary> /// 判断文件是否存在 /// &l ...

  10. java在线聊天项目1.2版 ——开启多个客户端,分别实现数据库注册和登录功能后,成功登陆则登录框消失,好友列表窗出现

    登录框消失语句 dispose(); 好友列表窗出现 使用new FriendsFrame(phone,s); 登陆对话框代码修改如下: package com.swift.frame; import ...