题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数。

n<=250000

如:abaaa

输出:

4

2

1

1

1

spoj上的时限卡的太严,必须使用O(N)的算法那才能过掉,所以采用后缀自动机解决。

一个字符串出现的次数,即为后缀自动机中该字符串对应的节点的right集合的大小,right集合的大小等于子树中叶子节点的数目。

令dp[i]表示长度为i的字符串出现的最大次数。dp[i]可以通过在后缀链接树中从叶子节点到根节点依次求出。

最后,按长度从大到小,用dp[i]去更新dp[i-1]。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. using namespace std;
  6. #define MAXN 250005
  7. #define MAXC 26
  8. struct node
  9. {
  10. int go[MAXC],sufflink,step,right;
  11. void clear()
  12. {memset(go,,sizeof go);
  13. sufflink=step=right=;
  14. }
  15. }tree[MAXN<<];
  16. int dp[MAXN],cnt[MAXN],rk[MAXN<<],root,tot,cur,last,len,ans;
  17. char s[MAXN];
  18. void insert(int val)
  19. {
  20. int p,q;
  21. tree[last].go[val]=++tot;
  22. cur=tot;
  23. tree[cur].clear();
  24. tree[cur].step=tree[last].step+;
  25. tree[cur].right++;
  26. for(p=tree[last].sufflink;p&&tree[p].go[val]==;p=tree[p].sufflink)
  27. tree[p].go[val]=cur;
  28. if(p==)
  29. tree[cur].sufflink=root;
  30. else
  31. {
  32. q=tree[p].go[val];
  33. if(tree[p].step+==tree[q].step)
  34. tree[cur].sufflink=q;
  35. else
  36. {
  37. tree[++tot].clear();
  38. tree[tot]=tree[q];
  39. tree[tot].right=;
  40. tree[tot].step=tree[p].step+;
  41. tree[cur].sufflink=tree[q].sufflink=tot;
  42. for(;tree[p].go[val]==q;p=tree[p].sufflink)
  43. tree[p].go[val]=tot;
  44. }
  45. }
  46. last=cur;
  47. }
  48. void calc()
  49. {
  50. int temp;
  51. for(int i=;i<=tot;i++)cnt[tree[i].step]++;
  52. for(int i=;i<=len;i++)cnt[i]+=cnt[i-];
  53. for(int i=;i<=tot;i++)rk[cnt[tree[i].step]--]=i;
  54. for(int i=tot;i>;i--)
  55. {
  56. temp=tree[rk[i]].sufflink;
  57. if(tree[rk[i]].right>dp[tree[rk[i]].step])dp[tree[rk[i]].step]=tree[rk[i]].right;
  58. if(temp)tree[temp].right+=tree[rk[i]].right;
  59. }
  60. for(int i=len-;i>=;i--)
  61. if(dp[i+]>dp[i])dp[i]=dp[i+];
  62. for(int i=;i<=len;i++)
  63. printf("%d\n",dp[i]);
  64. }
  65. int main()
  66. {
  67. while(~scanf("%s",s))
  68. {
  69. root=last=cur=tot=;
  70. tree[].clear();
  71. memset(dp,,sizeof dp);
  72. memset(cnt,,sizeof cnt);
  73. len=strlen(s);
  74. for(int i=;i<len;i++)
  75. insert(s[i]-'a');
  76. calc();
  77. }
  78. return ;

SPOJ bsubstr的更多相关文章

  1. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  2. SPOJ DQUERY D-query(主席树)

    题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...

  3. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  4. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

  5. 【SPOJ 7258】Lexicographical Substring Search

    http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...

  6. 【SPOJ 1812】Longest Common Substring II

    http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...

  7. 【SPOJ 8222】Substrings

    http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...

  8. SPOJ GSS2 Can you answer these queries II

    Time Limit: 1000MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Description Being a ...

  9. SPOJ 3273

    传送门: 这是一道treap的模板题,不要问我为什么一直在写模板题 依旧只放代码 Treap 版 //SPOJ 3273 //by Cydiater //2016.8.31 #include < ...

随机推荐

  1. Android斗地主棋牌游戏牌桌实现源码下载

    本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...

  2. 深入理解JavaScript系列:史上最清晰的JavaScript的原型讲解

    一说起JavaScript就要谈的几个问题,原型就是其中的一个.说了句大话,史上最清晰.本来是想按照大纲式的行文写一下,但写到后边感觉其实就一个概念,没有什么条理性,所以下面就简单按照概念解释的模式谈 ...

  3. Oracle 导入导出--and一些知识,备忘

    这两天在做迁移Ora数据库,有一个圆友帮忙,哈哈,两个臭皮匠顶半个诸葛亮. 本来以为很简单的就imp和exp就欧了,结果各种状况百出,百度了老多,学到好多东西. 你的导出:exp yc/yc@orcl ...

  4. ubuntu eclipse 中安装 python + PyDev

    参照网络和个人总结 系统配置:ubuntu12.04       jdk:1.6      eclipse:3.4 首先你的系统必须安装好pyton .也ubuntu系统自带的 刚开始以为是jdk安装 ...

  5. 多表关联 update

    UPDATE t_invests INNER JOIN t_user_coupons ON t_invests.user_coupon_id = t_user_coupons.id SET t_inv ...

  6. 对象关联(associated objects)

    category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法:associative,可以通过它来扩展属性:在iOS开发中,可能 ...

  7. 2016年4月面试题(Unity)

    一. C#中值类型和引用类型的区别? A: 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 值类型存取速度快,引用类型存取速度慢 值类型表示实际数据, ...

  8. MCMC: The Metropolis-Hastings Sampler

    本文主要译自:MCMC:The Metropolis-Hastings Sampler 上一篇文章中,我们讨论了Metropolis 采样算法是如何利用马尔可夫链从一个复杂的,或未归一化的目标概率分布 ...

  9. 修改PHP上传文件大小限制的方法

    感谢分享,原文地址:http://www.cnblogs.com/newsouls/archive/2012/12/27/2835628.html 修改PHP上传文件大小限制的方法1. 一般的文件上传 ...

  10. 今天第一次接触到typescript,看了第一个知识点就是变量的声明,来回忆回忆,做做笔记

    以前只用过JavaScript原生写网站特效,今天还是第一次听说typescript的,然后看了一下它的基本知识,感觉很像Java,真的太像了,但是又有不同点.很让我惊奇看到的第一个知识点就和以前不同 ...