http://www.spoj.com/problems/NSUBSTR/

题意:

F(x)定义为字符串S中所有长度为x的子串重复出现的最大次数

输出F[1]~F[len(S)]

用字符串S构建后缀自动机

若子串 str ∈状态s,那么子串str 在字符串S中出现的次数就是| Right(s) |

显然不能枚举所有状态的所有子串

但是我们可以线性的时间得到F[Max(s)]= | Right(s) |

然后再对F做一个后缀最大值即可

如何得到 一个状态Right集合的大小?

一个状态s的Right集合就是Parent树上,s的子树中叶子节点Right集合的并集

所以可以 从parent树上 底层向上层更新,即将底层节点的Right并入父节点的Right

这个可以通过拓扑排序实现

#include<cstdio>
#include<cstring> #define N 250002 #define max(x,y) ((x)>(y) ? (x) : (y)) char s[N]; int tot=,fa[N<<],len[N<<],ch[N<<][];
int last=,p,np,q,nq; int front[N<<],nxt[N<<],to[N<<],cnt; int r[N<<],f[N];
int v[N<<],sa[N<<]; void extend(int c)
{
len[np=++tot]=len[last]+;
for(p=last;p && !ch[p][c]; p=fa[p]) ch[p][c]=np;
if(!p) fa[np]=;
else
{
q=ch[p][c];
if(len[q]==len[p]+) fa[np]=q;
else
{
len[nq=++tot]=len[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[nq]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
last=np;
} int main()
{
scanf("%s",s+);
int n=strlen(s+);
for(int i=;i<=n;++i)
{
r[tot+]=;
extend(s[i]-'a');
}
for(int i=;i<=tot;++i) v[len[i]]++;
for(int i=;i<=n;++i) v[i]+=v[i-];
for(int i=;i<=tot;++i) sa[v[len[i]]--]=i;
for(int i=tot;i;--i) r[fa[sa[i]]]+=r[sa[i]];
for(int i=;i<=tot;++i) f[len[i]]=max(f[len[i]],r[i]);
for(int i=n-;i;--i) f[i]=max(f[i],f[i+]);
for(int i=;i<=n;++i) printf("%d\n",f[i]);
}

最新文章

  1. 模仿迅L看看&lt;音频播放器&gt; 实现点击进度条,跳转播放
  2. Python 面向对象(初级篇)
  3. C语言数组空间的初始化详解
  4. linux命令:mkdir 命令详解
  5. OAuth2.0 在 SSO中的应用~
  6. loj 1156(二分+最大流)
  7. RPi 2B USB 远程桌面
  8. 操作符重载.xml
  9. C# winform 最小化到电脑右下角
  10. javascript实现Map
  11. Javascript知识四(DOM)
  12. mysql zip 版安装
  13. NOIP2017滚粗记
  14. linux 编译c程序与动态链接库
  15. Linux的安装(虚拟机环境)与基础配置
  16. [dev][go] 入门Golang都需要了解什么
  17. js demo1
  18. DRF之解析器源码解析
  19. Codeforces 603A - Alternative Thinking - [字符串找规律]
  20. 隐藏网页中DIV和DOM的各种方法

热门文章

  1. java监听器(Listener)学习笔记
  2. 【Android UI设计与开发】第03期:引导界面(三)仿微信引导界面以及动画效果
  3. PAT甲题题解-1051. Pop Sequence (25)-堆栈
  4. 数据库——SQL数据单表查询
  5. OpenState安装及 Port Knocking 实验
  6. OpenState: Programming Platform-independent Stateful OpenFlow Applications Inside the Switch
  7. 剑指offer:合并两个排序的链表
  8. 软件工程之四则运算--Github
  9. 新安装的Ubuntu设置root密码
  10. Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题