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

相同子串算多个的话,先求好 right ,然后求一个 sm 表示走到这个点之后有几种走法,即把 DAG 上自己能走到的点的 right 都收集起来,可用拓扑序解决。

相同子串算一个的话,给 DAG 上每个节点都赋上一个1,表示走到那个节点的话算一个子串;然后把 DAG 上自己能走到的点的1都收集起来。

然后可按字典序 dfs 这个 DAG ,如果 k 在这个分支里的话就走进去,否则 k -= sm[ ] ,然后看别的分支。

不用管 len[ ] ,因为 len[ ] 表示自己这个点管辖的许多子串,但如果自己是 dfs 地走过来,就只对应了其中一个子串,所以只用管 right 就行了。

之所以相同子串算一个的话要给复制出来的那些 nq 也赋一个1,是因为 nq 只是分了一些 q 管辖的子串;如果自己 dfs 着本应走到 q 点,但因为 nq 分管了一些而走到了 nq 点的话,自己也算走到了一个子串结尾的位置(1个而不是len个),所以应该计数1。

注意用 a[ i ] 而不是 i 。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const int N=5e5+,M=1e6+,K=;
  7. int lst=,cnt=,go[M][K],fa[M],l[M],rt[M];ll sm[M];
  8. int tx[N],a[M];
  9. char ch[N];
  10. void add(int w)
  11. {
  12. int p=lst,np=++cnt;lst=np;l[np]=l[p]+;rt[np]=;
  13. for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
  14. if(!p)fa[np]=;
  15. else
  16. {
  17. int q=go[p][w];
  18. if(l[q]==l[p]+)fa[np]=q;
  19. else
  20. {
  21. int nq=++cnt;l[nq]=l[p]+;
  22. fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;
  23. memcpy(go[nq],go[q],sizeof go[q]);
  24. for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
  25. }
  26. }
  27. }
  28. void Rsort(int n,bool T)
  29. {
  30. for(int i=;i<=cnt;i++)tx[l[i]]++;
  31. for(int i=n-;i>=;i--)tx[i]+=tx[i+];
  32. for(int i=cnt;i;i--)a[tx[l[i]]--]=i;
  33. for(int i=;i<=cnt;i++)
  34. {
  35. int d=a[i];
  36. if(!T)rt[d]=;
  37. else rt[fa[d]]+=rt[d];
  38. }
  39. // if(T)for(int i=1;i<=cnt;i++)rt[fa[a[i]]]+=rt[a[i]];//if()!!!!///a[]!!!!!!
  40. for(int i=;i<=cnt;i++)
  41. {
  42. int d=a[i];///
  43. sm[d]=rt[d];
  44. for(int j=;j<=;j++)
  45. if(go[d][j])
  46. {
  47. sm[d]+=sm[go[d][j]];
  48. }
  49. }
  50. rt[]=;//
  51. }
  52. int main()
  53. {
  54. scanf("%s",ch);int n=strlen(ch);
  55. for(int i=;i<n;i++)add(ch[i]-'a'+);
  56. int T,k; scanf("%d%d",&T,&k);
  57. Rsort(n,T);
  58. int cr=;
  59. bool flag=;
  60. while()
  61. {
  62. if(rt[cr]>=k)break;
  63. k-=rt[cr]; int ycr=cr;
  64. for(int i=,d;i<=;i++)
  65. if(sm[d=go[cr][i]]>=k)
  66. {putchar(i+'a'-);cr=d;break;}
  67. else k-=sm[d];
  68. if(cr==ycr){printf("-1");break;}
  69. }
  70. return puts("");
  71. }

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]弦论 ——后缀自动机

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

  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. 求最长不下降子序列(nlogn)

    最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长 ...

  2. JSP实现原理

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. 起源: 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要 ...

  3. Spring框架下Junit测试

    Spring框架下Junit测试 一.设置 1.1 目录 设置源码目录和测试目录,这样在设置产生测试方法时,会统一放到一个目录,如果没有设置测试目录,则不会产生测试代码. 1.2 增加配置文件 Res ...

  4. NSwag在asp.net web api中的使用,基于Global.asax

    https://github.com/NSwag/NSwag/wiki/OwinGlobalAsax This page explains how to use the NSwag OWIN midd ...

  5. spark数据监控实战

    版权申明:转载请注明出处.文章来源:http://bigdataer.net/?p=248 排版乱?请移步原文获得更好的阅读体验   1.概述 数据准确性,稳定性,时效性是数据开发中需要重点关注的,一 ...

  6. tomcat配置访问图片路径映射到磁盘路径

    首先,我在调试页面的时候发现,图片路径为: /webapps/pic_son/img/1234565456.jpg 但是,tomcat中webapps的文件夹下的pic_son项目中,img文件夹是空 ...

  7. FM算法 的总结

    FM的总结: 1.FM算法与线性回归相比增加了特征的交叉.自动选择了所有特征的两两组合,并且给出了两两组合的权重. 2.上一条所说的,如果给两两特征的组合都给一个权重的话,需要训练的参数太多了.比如我 ...

  8. HTTP Status 500 - com.opensymphony.xwork2.ActionSupport.toAddPage()

    使用struts2过程中碰到以下错误 HTTP Status 500 - com.opensymphony.xwork2.ActionSupport.toAddPage() type Exceptio ...

  9. 【Python那些事儿之十】range()和xrange()

    by Harrison Feng in Python 无论是range()还是xrange()都是Python里的内置函数.这个两个内置函数最常用在for循环中.例如: >>> fo ...

  10. P3374 【模板】树状数组 1

    树状数组模板题,用cdq分治做 cdq分治: 分:把l到r分成两个区间操作 治:对每个分出来的区间进行操作 但是cdq分治和一般分治不同的是,一般的分治左右两个区间互不干扰,但是cdq分治处理的是区间 ...