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

n<=250000

如:abaaa

输出:

4

2

1

1

1

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

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

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

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

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAXN 250005
#define MAXC 26
struct node
{
int go[MAXC],sufflink,step,right;
void clear()
{memset(go,,sizeof go);
sufflink=step=right=;
}
}tree[MAXN<<];
int dp[MAXN],cnt[MAXN],rk[MAXN<<],root,tot,cur,last,len,ans;
char s[MAXN];
void insert(int val)
{
int p,q;
tree[last].go[val]=++tot;
cur=tot;
tree[cur].clear();
tree[cur].step=tree[last].step+;
tree[cur].right++;
for(p=tree[last].sufflink;p&&tree[p].go[val]==;p=tree[p].sufflink)
tree[p].go[val]=cur;
if(p==)
tree[cur].sufflink=root;
else
{
q=tree[p].go[val];
if(tree[p].step+==tree[q].step)
tree[cur].sufflink=q;
else
{
tree[++tot].clear();
tree[tot]=tree[q];
tree[tot].right=;
tree[tot].step=tree[p].step+;
tree[cur].sufflink=tree[q].sufflink=tot;
for(;tree[p].go[val]==q;p=tree[p].sufflink)
tree[p].go[val]=tot;
}
}
last=cur;
}
void calc()
{
int temp;
for(int i=;i<=tot;i++)cnt[tree[i].step]++;
for(int i=;i<=len;i++)cnt[i]+=cnt[i-];
for(int i=;i<=tot;i++)rk[cnt[tree[i].step]--]=i;
for(int i=tot;i>;i--)
{
temp=tree[rk[i]].sufflink;
if(tree[rk[i]].right>dp[tree[rk[i]].step])dp[tree[rk[i]].step]=tree[rk[i]].right;
if(temp)tree[temp].right+=tree[rk[i]].right;
}
for(int i=len-;i>=;i--)
if(dp[i+]>dp[i])dp[i]=dp[i+];
for(int i=;i<=len;i++)
printf("%d\n",dp[i]);
}
int main()
{
while(~scanf("%s",s))
{
root=last=cur=tot=;
tree[].clear();
memset(dp,,sizeof dp);
memset(cnt,,sizeof cnt);
len=strlen(s);
for(int i=;i<len;i++)
insert(s[i]-'a');
calc();
}
return ;

最新文章

  1. 阿里云 SDK python3支持
  2. (转)基于jQuery的form转json示例
  3. 个推,手机推送API的使用
  4. LeetCode(97) Interleaving String
  5. pdo简单操作
  6. 将CSDN和WordPress上的旧文章迁移过来
  7. 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)
  8. Four Operations---hdu5938(暴力)
  9. PHP Warning: ob_start() : output handler &#39;ob_gzhandler conflicts with &#39;zlib output compression&#39;
  10. BZOJ 4723 Flappy Bird
  11. CListView虚拟列表
  12. 基于51,人体红外感应和RC522的门禁系统
  13. EasyMock 使用方法与原理剖析--转载
  14. Laravel 源码解读系列第四篇-Auth 机制
  15. LeetCode 64. Minimum Path Sum(最小和的路径)
  16. 撸一撸Spring Cloud Ribbon的原理-负载均衡器
  17. H5新特性之webWorker
  18. sql select中加入常量列
  19. 洛谷 P1462 通往奥格瑞玛的道路 解题报告
  20. SVN服务器搭建和使用-转载

热门文章

  1. Java里面,反射父类里面数字类型字段,怎么set值
  2. Unity3D 处理Label的颜色代码
  3. NOIP 考前 计算几何练习
  4. [windows]部分前缀以及其意义
  5. 【转】JavaScript 风格指南/编码规范(Airbnb公司版)
  6. PARSEC-3.0编译错误
  7. C#产生不重复随机数
  8. UE4 Windows平台部署游戏到IOS 第二部分
  9. Windows下安装openssl
  10. Redis和Memcache的区别