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. spring boot 实现文件下载

    html 代码 js部分 window.location.href= this.Baseurl+'/plan/down?file='+filename; spring boot 后台代码@GetMap ...

  2. 贪心算法HURUST题目

    题目描述: Yogurt factory The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. ...

  3. Kubernetes采用CoreDNS

    参考文档: kubernetes插件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns 自 ...

  4. 实训二(cocos2dx 2.x 打包apk)

    利用cocos2dx编程得到的展现形式之一就是最终的apk,中间的过程只有自己走过才能知道,对于没有章法的初学者,那是相当的头疼, 言归正传,2.x到3.x版本引擎变动很大,除去了CC只是很小一方面, ...

  5. MarkDown to PDF

    前面随便说说 之前在 windows 上一直习惯用 cmdmarkdown 把要写的东西写下来,再通过 typora 转成 pdf:现在很多时候在用 Ubuntu,需要把写完的作业转成 pdf 交上去 ...

  6. [2017BUAA软工]提问回顾

    原博客链接 原问题1:有没有系统的方法来提高一开始的文档的设计后的质量呢 在之前的OO课程上,我已经深刻领会到了设计的重要性,而且在这次的团队开发中,我也是负责从需求分析到代码设计的转换,所以对设计这 ...

  7. Helm 安装 wordpress

    1. 前置需要安装 storageclass 然后 安装helm 客户端 helm tiller 服务端 2. 设置 当前的位阿里云的 repo 3. 查找 wordpress的镜像 helm sea ...

  8. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

  9. SSM 项目搭建 (IDEA)

    好好想了想,还是准备给大家发一个简单的SSM的项目搭建教程. 我觉得通常来说,只是XML的配置文件可能让人头痛了点,其他的倒真不是问题. 不过话说回来,mybatis一直让我觉得用起来不方便.因为数据 ...

  10. MT【103】二阶递推找规律

    评:如果直接找$a_n$的二阶递推式:$a_{n+2}-2\sqrt{2}a_{n+1}-a_n=0$有根号,不利于估计尾数.