SPOJ 8222 NSUBSTR - Substrings
2024-10-19 21:37:00
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]);
}
最新文章
- 模仿迅L看看<;音频播放器>; 实现点击进度条,跳转播放
- Python 面向对象(初级篇)
- C语言数组空间的初始化详解
- linux命令:mkdir 命令详解
- OAuth2.0 在 SSO中的应用~
- loj 1156(二分+最大流)
- RPi 2B USB 远程桌面
- 操作符重载.xml
- C# winform 最小化到电脑右下角
- javascript实现Map
- Javascript知识四(DOM)
- mysql zip 版安装
- NOIP2017滚粗记
- linux 编译c程序与动态链接库
- Linux的安装(虚拟机环境)与基础配置
- [dev][go] 入门Golang都需要了解什么
- js demo1
- DRF之解析器源码解析
- Codeforces 603A - Alternative Thinking - [字符串找规律]
- 隐藏网页中DIV和DOM的各种方法
热门文章
- java监听器(Listener)学习笔记
- 【Android UI设计与开发】第03期:引导界面(三)仿微信引导界面以及动画效果
- PAT甲题题解-1051. Pop Sequence (25)-堆栈
- 数据库——SQL数据单表查询
- OpenState安装及 Port Knocking 实验
- OpenState: Programming Platform-independent Stateful OpenFlow Applications Inside the Switch
- 剑指offer:合并两个排序的链表
- 软件工程之四则运算--Github
- 新安装的Ubuntu设置root密码
- Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题