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]);
}

SPOJ 8222 NSUBSTR - Substrings的更多相关文章

  1. ●SPOJ 8222 NSUBSTR–Substrings

    题链: http://www.spoj.com/problems/NSUBSTR/题解: 后缀自动机. 不难发现,对于自动机里面的一个状态s, 如果其允许的最大长度为maxs[s],其right集合的 ...

  2. ●SPOJ 8222 NSUBSTR - Substrings(后缀数组)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 同届红太阳 --WSY给出的后缀数组解法!!! 首先用倍增算法求出 sa[i],rak[i],hei[i]然 ...

  3. ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...

  4. 【刷题】SPOJ 8222 NSUBSTR - Substrings

    You are given a string S which consists of 250000 lowercase latin letters at most. We define F(x) as ...

  5. 【SPOJ 8222】Substrings

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

  6. SPOJ:NSUBSTR - Substrings

    题面 字符串$ S \(最多包含\) 25 \(万个小写拉丁字母.我们将\) F(x) \(定义为长度为\) x \(的某些字符串出现在\) s \(中的最大次数.例如,对于字符串\) "a ...

  7. SPOJ 8222 NSUBSTR(SAM)

    这几天看了N多论文研究了下后缀自己主动机.刚開始蛋疼的看着极短的代码和clj的论文硬是看不懂,后来结合其它几篇论文研究了下.总算是明确了一些 推荐文章http://blog.sina.com.cn/s ...

  8. spoj 8222 NSUBSTR 求长度为x的子串中出现次数最大值 SAM

    题目大意 给一个字符串S 令F(x)表示S的所有长度为x的子串中 出现次数的最大值. 求F(1)..F(Length(S)) 分析 一个节点\(x\)的长度有\(~~(max(fa),max(x)]\ ...

  9. spoj 8222 Substrings (后缀自动机)

    spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...

随机推荐

  1. NodeJS旅程 : Less

    我一直强调我是个很懒的人,虽然我认为自己是个代码控但不代表我喜欢写大量代码.有做Web前端开发的人一定都接触CSS,由其在当下CSS3更是做出Cool站的必修课.我曾和不少的前端开发讨论过CSS3,我 ...

  2. eclipse中怎么找项目部署的路径和找编译后的class路径

    1.快捷键 ctrl+shift+R,会默认显示你的源文件.java的路径,如果没有.class的话,点击右上角的三角,选中  Show Derived Resource; 2.打开出现下图 3.按下 ...

  3. JMeter采用NON GUI模式时如何记录并查看错误

    在GUI模式下执行JMeter测试时,我们可以通过添加View Results Tree组件来查看JMeter请求的各类详情.那如果在正式测试场景中,当我们采用NON GUI模式时,遇到了断言或其他错 ...

  4. Kaggle入门(一)——Digit Recognizer

    目录 0 前言 1 简介 2 数据准备 2.1 导入数据 2.2 检查空值 2.3 正则化 Normalization 2.4 更改数据维度 Reshape 2.5 标签编码 2.6 分割交叉验证集 ...

  5. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...

  6. 桌面输入法评测报告 之 搜狗拼音输入法vs必应拼音输入法

    输入法是电脑用户不可或缺的软件,它几乎无时无刻不陪伴在使用者的身旁.一个优秀的输入法,应该满足客户对使用体验以及效率的需求.我们小队的任务便是对当今最为常用的两种输入法: 搜狗拼音输入法和必应拼音输入 ...

  7. PowerTeam--Alpha阶段个人贡献分及转会人员

    PowerTeam--Alpha阶段个人贡献分 我们的团队共有6人,总分300分. 经团队成员通过个人申请以及组内投票的方式,最终的等级评定如下面的等级评定矩阵所示:   β1 β2 β3 γ1 γ2 ...

  8. Alpha版本测试

    Alpha版本测试报告 项目名称:面向团队的日程提醒系统 软件版本:1.0.0 开发方:Team c# 开发代表:崔强 杜正远 是否经过开发自测(单元测试):是 软件运行环境: Android4.4. ...

  9. 《Linux内核分析》第一周——计算机是如何工作的?

    杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课程内容 1.诺曼依体系 ...

  10. C语言版本:双链表的实现

    Dlist.h #ifndef __DLIST_H__ #define __DLIST_H__ #include<cstdio> #include<malloc.h> #inc ...