https://www.lydsy.com/JudgeOnline/problem.php?id=3998

https://www.luogu.org/problemnew/show/P3975

对于一个给定长度为N的字符串,求它的第K小子串是什么。

后缀自动机,对l排序然后从后往前推size和sum数组(貌似也可以叫拓扑?)。

size:当前状态的字符串个数(贡献)。

sum:以当前状态为起点之后的满足要求的字符串个数。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cctype>
  7. using namespace std;
  8. typedef long long ll;
  9. const int N=1e6+;
  10. struct tree{
  11. int a[],fa,l;
  12. }tr[N];
  13. char s[N];
  14. int last,cnt,t,k;
  15. ll a[N],w[N],size[N],sum[N];
  16. inline void insert(int c){
  17. int p=last,np=++cnt;
  18. last=np;tr[np].l=tr[p].l+;
  19. for(;p&&!tr[p].a[c];p=tr[p].fa)tr[p].a[c]=np;
  20. if(!p)tr[np].fa=;
  21. else{
  22. int q=tr[p].a[c];
  23. if(tr[p].l+==tr[q].l)tr[np].fa=q;
  24. else{
  25. int nq=++cnt;tr[nq].l=tr[p].l+;
  26. memcpy(tr[nq].a,tr[q].a,sizeof(tr[q].a));
  27. tr[nq].fa=tr[q].fa;tr[q].fa=tr[np].fa=nq;
  28. for(;p&&tr[p].a[c]==q;p=tr[p].fa)tr[p].a[c]=nq;
  29. }
  30. }
  31. size[np]=;
  32. }
  33. int main(){
  34. scanf("%s%d%d",s,&t,&k);
  35. int len=strlen(s);
  36. last=cnt=;
  37. for(int i=;i<len;i++)insert(s[i]-'a');
  38. for(int i=;i<=cnt;i++)w[tr[i].l]++;
  39. for(int i=;i<=len;i++)w[i]+=w[i-];
  40. for(int i=;i<=cnt;i++)a[w[tr[i].l]--]=i;
  41. for(int i=cnt;i>=;i--){
  42. if(t)size[tr[a[i]].fa]+=size[a[i]];
  43. else size[a[i]]=;
  44. }
  45. size[]=;
  46. for(int i=cnt;i>=;i--){
  47. sum[a[i]]=size[a[i]];
  48. for(int j=;j<;j++)
  49. if(tr[a[i]].a[j])
  50. sum[a[i]]+=sum[tr[a[i]].a[j]];
  51. }
  52. if(k>sum[])puts("-1");
  53. else{
  54. int now=;
  55. while(k>size[now]){
  56. k-=size[now];
  57. int i;
  58. for(int i=;i<;i++){
  59. if(k>sum[tr[now].a[i]])
  60. k-=sum[tr[now].a[i]];
  61. else{
  62. now=tr[now].a[i];
  63. putchar(i+'a');
  64. break;
  65. }
  66. }
  67. }
  68. puts("");
  69. }
  70. return ;
  71. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ3998:[TJOI2015]弦论——题解的更多相关文章

  1. [bzoj3998][TJOI2015]弦论_后缀自动机

    弦论 bzoj-3998 TJOI-2015 题目大意:给定一个字符串,求其$k$小子串. 注释:$1\le length \le 5\cdot 10^5$,$1\le k\le 10^9$. 想法: ...

  2. bzoj3998: [TJOI2015]弦论(SAM+dfs)

    3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...

  3. 洛谷 P3975 / loj 2102 [TJOI2015] 弦论 题解【后缀自动机】【拓扑排序】

    后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \ ...

  4. BZOJ3998 TJOI2015弦论(后缀数组+二分答案)

    先看t=1的情况.显然得求出SA(因为我不会SAM).我们一位位地确定答案.设填到了第len位,二分这一位填什么之后,在已经确定的答案所在的范围(SA上的某段区间)内二分,找到最后一个小于当前串的后缀 ...

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

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

  6. bzoj3998: [TJOI2015]弦论

    SAM小裸题qwq #include <iostream> #include <cstdio> #include <cmath> #include <cstr ...

  7. bzoj3998 [TJOI2015]弦论(SAM)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3998 [题意] 询问排名第k的子串是谁,0代表相同子串不同位置算作相同,1代表相同子串 ...

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

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

  9. 2018.12.15 bzoj3998: [TJOI2015]弦论(后缀自动机)

    传送门 后缀自动机基础题. 求第kkk小的子串(有可能要求本质不同) 直接建出samsamsam,然后给每个状态赋值之后在上面贪心选最小的(过程可以类比主席树/平衡树的查询操作)即可. 代码: #in ...

随机推荐

  1. webpack loader 生成虚拟文件的方案

    此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...

  2. webpack中Development和Production模式的区分打包

    当我们在开发一个项目的时候,我们一般用development这个环境进行项目的开发,在这个环境下,webpack使用dev-server,帮我们启用一个服务器,然后这个服务器里面还集成了一些,比如hm ...

  3. JavaWeb(三)——Tomcat服务器(二)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  4. PS 抠图和添加背景图

    1.打开需要抠的图--然后使用套索类工具,魔棒类工具,钢笔类工具均可选择需要扣的图片范围任何在Delete(如果抠反了可以进行反选Ctrl +shift+I) 2.然后把任一一张背景图直接拖到PS里面 ...

  5. InnoDB锁冲突案例演示

      Preface       As we know,InnoDB is index organized table.InnoDB engine supports row-level lock bas ...

  6. 征战 OSG-序及目录

    其实很早就应该写这个了,一直拖到现在就是因为懒啊. 自从七月演习回来,被划到三维平台开发部,就一直混日子,也没人带领,也没人问结果,就这么一直堕落下来了,直到有一天才发现自己也看不上自己了,觉得自己这 ...

  7. uiautomatorviewer定位App元素

    这个工具是Android SDK自带的, 日常的工作中经常要使用的, 在C:\Android\sdk\tools\bin目录下: 双击之, 请注意, 我一般选择第一个机器人小图标Device Scre ...

  8. 【WXS全局对象】consloe

    consloe对象 方法: 原型:console.log( [String] ) 说明:用于在 console 窗口输出信息,一般用于程序调试使用示例: console.log支持arguments类 ...

  9. 【Random】-随机数字-jmeter

    参数化 Random 参数化,存储结果的变量名,名字写了,就可以给其它请求使用

  10. post接口_ajax上传

    Action() { web_reg_save_param("find_msg", "LB=message\":\"", "RB= ...