描述

小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为一段数构成的数列。

现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数。但是K不是固定的,小Hi想知道对于所有的K的答案。

输入

共一行,包含一个由小写字母构成的字符串S。字符串长度不超过 1000000。

输出

共Length(S)行,每行一个整数,表示答案。

样例输入

  1. aab

样例输出

  1. 2
  2. 1
  3. 1

1,很好的利用了拓扑。

2,利用了单调性。

  1. for(i=tot;i>;i--){
  2. ans[i]=max(ans[i],ans[i+]);
  3. }

2017-11-24 代码是舶来品,参考hihocoder,等把后缀自动机消化了自己再写一遍吧。

2017-11-25 这几个题理解得差不多了。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<string>
  8. #include<queue>
  9. using namespace std;
  10. typedef long long ll;
  11. const int inf=0x3f3f3f3f;
  12. const int N=1e6+;
  13. const int M=1e6+;
  14. int tot,slink[*N],trans[*N][],minlen[*N],maxlen[*N],edpts[*N],n;
  15. char str[*N];
  16. int blue[*N],ind[*N],ans[*N+];
  17. int newstate(int _maxlen,int _minlen,int* _trans,int _slink) {
  18. maxlen[++tot]=_maxlen;
  19. minlen[tot]=_minlen;
  20. slink[tot]=_slink;
  21. if(_trans)
  22. for(int i=; i<; i++)
  23. trans[tot][i]=_trans[i];
  24. return tot;
  25. }
  26. int add(char ch,int u) {
  27. int c=ch-'a',v=u;
  28. int z=newstate(maxlen[u]+,-,NULL,);
  29. blue[z]=;//绿色
  30. while(v&&!trans[v][c]) {
  31. trans[v][c]=z;
  32. v=slink[v];
  33. }
  34. if(!v) {
  35. minlen[z]=;
  36. slink[z]=;
  37. ind[]++;
  38. return z;
  39. }
  40. int x=trans[v][c];
  41. if(maxlen[v]+==maxlen[x]) {
  42. slink[z]=x;
  43. minlen[z]=maxlen[x]+;
  44. ind[x]++;
  45. return z;
  46. }
  47. int y=newstate(maxlen[v]+,-,trans[x],slink[x]);
  48. slink[z]=slink[x]=y;
  49. ind[y]+=;
  50. minlen[x]=minlen[z]=maxlen[y]+;
  51. while(v&&trans[v][c]==x) {
  52. trans[v][c]=y;
  53. v=slink[v];
  54. }
  55. minlen[y]=maxlen[slink[y]]+;
  56. return z;
  57. }
  58. void count() {
  59. queue<int> q;
  60. for( int i=; i <=tot; i++ )if( !ind[i] ) {
  61. q.push(i);
  62. }
  63. while( !q.empty() ) {
  64. int u = q.front();
  65. q.pop();
  66. if(blue[u] ) edpts[u]++;
  67. edpts[ slink[u]] += edpts[u];
  68. if( !--ind[slink[u]] ) q.push(slink[u]);
  69. }
  70. }
  71.  
  72. int main() {
  73. int i;
  74. scanf("%s",str);
  75. int len=strlen(str),pre=;
  76. tot=;
  77. for(i=; i<len; i++) {
  78. pre=add(str[i],pre);
  79. }
  80. count();
  81. for(i=;i<=tot;i++){
  82. ans[maxlen[i]] = max(ans[maxlen[i]],edpts[i]);
  83. }
  84. for(i=tot;i>;i--){
  85. ans[i]=max(ans[i],ans[i+]);
  86. }
  87. for(i=;i<=len;i++)printf("%d\n",ans[i]);
  88. return ;
  89. }

HihoCoder1449 重复旋律6(后缀自动机)的更多相关文章

  1. hihoCoder.1465.后缀自动机五 重复旋律8(后缀自动机)

    题目链接 \(Description\) 给定母串S,求模式串的循环同构串在S中的出现次数. \(Solution\) 将模式串s复制一遍,在母串的SAM上匹配,记录以每个位置作为后缀所能匹配的最大长 ...

  2. hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  3. 【HIHOCODER 1403】后缀数组一·重复旋律(后缀数组)

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律.旋律是一段连续的数列,相似的旋律在原数列 ...

  4. HihoCoder 重复旋律

    あの旋律を何度も繰り返しでも.あの日見た光景を再現できない 无论将那段旋律重复多少次,也无法重现那一日我们看到的景象 もし切ないならば.時をまきもどしてみるかい? 若是感到惆怅的话,要试着让时光倒流吗 ...

  5. 【后缀自动机】hihocoder1449 后缀自动机三·重复旋律6

    解题方法提示 小Hi:上次我们已经学习了后缀自动机了,今天我们再来解决一个用到后缀自动机的问题. 小Ho:好!那我们开始吧! 小Hi:现在我们要对K=1..length(S)求出所有长度为K的子串中出 ...

  6. HihoCoder1449 后缀自动机三·重复旋律6

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数.但是K不是固定的,小Hi想知道对 ...

  7. BZOJ 后缀自动机四·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...

  8. hihoCoder 后缀自动机三·重复旋律6

    后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...

  9. hihoCoder #1445 : 后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

随机推荐

  1. BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除

    //Long是需要比较精度的,所以要用longValueif(project.getFriendId().longValue() != friendId.longValue()) { return t ...

  2. (C#)ListView双击Item事件

    /// <summary> /// 双击选择播放列表项进行播放 /// </summary> /// <param name="sender"> ...

  3. JavaScript:学习笔记(1)——在HTML中使用JS

    在HTML中使用JavaScript <script>元素 1.直接在网页中嵌入JS代码 说明: 请不要在代码的任何地方出现</script>字符串 这是由于解析嵌入式代码的规 ...

  4. PHP生成缩略图,控制图片质量,支持.png .jpg .gif

    namespace common\components; class ResizeImageHelper { public $type;//图片类型 public $width;//实际宽度 publ ...

  5. asp.net 文件上传

    前台js <script type="text/javascript"> window.onload = function () { document.getEleme ...

  6. Swift进阶 - 12个技巧

    听说你已经学习Swift几个月了,有没有想更进一步成为Swift高手的想法?我这里有11招秘技,各位施主且听我慢慢道来,结个善缘. 1. 扩展(Extension) 任务: 求数字的平方. // 菜鸟 ...

  7. Hibernate_HelloWord

    Hibernate操作步骤 1.新建项目 2.加jar包 3.写XML配置文件hibernate.cfg.xml 4.写log4j.properties日志文件 5.在MySql数据库中建studen ...

  8. JavaScript笔记01——数据存储(包括.js文件的引用)

    While, generally speaking, HTML is for content and CSS is for presentation, JavaScript is for intera ...

  9. Object.defineProperty小解

    最早认识这个函数,源于对vue双向绑定的探索,vue通过这个函数实现属性挟持并结合发布者-订阅者模式实现双向绑定 先看一个实例: var o= {name: 'a'} Object.definePro ...

  10. iOS面试必备-iOS基础知识

    近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...