[后缀自动机 模板题] SPOJ 8222 Substrings
来源:互联网 发布:进程调度算法代码 编辑:程序博客网 时间:2024/05/19 12:11
题目大意:求某个长度的所有子串中出现次数最多的次数
每个状态对应一段长度区间的子串
right集合的大小就是出现次数
那么我们用|right(x)|去更新f[maxs[x]]的值,最后从大到小用f[i]去更新f[i-1]的值即可
#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++;}inline int read(char *s){ char c=nc(); int len=0; for (;!(c>='a' && c<='z');c=nc()) if (c==EOF) return 0; for (;c>='a' && c<='z';s[++len]=c,c=nc()); s[++len]=0; return len-1;}const int N=250005;struct state{ int len,link,next[26];}st[N<<1];int ncnt,last;int cnt[N<<1];inline void Extend(char c){ int cur=++ncnt,p; c-='a'; st[cur].len=st[last].len+1; cnt[cur]=1; for (p=last;p!=-1 && !st[p].next[c];p=st[p].link) st[p].next[c]=cur; if (p==-1) st[cur].link=0; else{ int q=st[p].next[c]; if (st[q].len==st[p].len+1) st[cur].link=q; else{ int nq=++ncnt; st[nq].len=st[p].len+1; st[nq].link=st[q].link; for (int i=0;i<26;i++) st[nq].next[i]=st[q].next[i]; for (;p!=-1 && st[p].next[c]==q;p=st[p].link) st[p].next[c]=nq; st[q].link=st[cur].link=nq; } } last=cur;}int tmp[N<<1],sum[N<<1];inline void Sort(){ for (int i=0;i<=ncnt;i++) sum[st[i].len]++; for (int i=1;i<=st[last].len;i++) sum[i]+=sum[i-1]; for (int i=0;i<=ncnt;i++) tmp[sum[st[i].len]--]=i;}char A[N]; int na;int ans[N];int main(){ freopen("t.in","r",stdin); freopen("t.out","w",stdout); na=read(A); st[0].link=-1; for (int i=1;i<=na;i++) Extend(A[i]); Sort(); for (int i=ncnt+1;i;i--) if (tmp[i]) cnt[st[tmp[i]].link]+=cnt[tmp[i]]; for (int i=0;i<=ncnt;i++) ans[st[i].len]=max(ans[st[i].len],cnt[i]); for (int i=na;i;i--) ans[i-1]=max(ans[i-1],ans[i]); for (int i=1;i<=na;i++) printf("%d\n",ans[i]); return 0;}
0 0
- [后缀自动机 模板题] SPOJ 8222 Substrings
- spoj 8222 Substrings (后缀自动机)
- spoj 8222 substrings 【后缀自动机】
- SPOJ 8222. Substrings(后缀自动机模板)
- SPOJ Substrings --后缀自动机
- spoj Substrings【后缀自动机】
- spoj 8222 Substrings(NSUBSTR),后缀自动机
- spoj 8222 Substrings (后缀自动机+dp)
- spoj 8222 Substrings(后缀自动机)
- SPOJ 8222 NSUBSTR - Substrings (后缀自动机)
- SPOJ 8222 Substrings 后缀自动机入门
- SPOJ NSUBSTR Substrings 后缀自动机
- SPOJ - NSUBSTR Substrings 后缀自动机
- SPOJ 8222 [后缀自动机]
- SPOJ 694 Distinct Substrings 后缀数组 模板
- [后缀自动机 模板题] SPOJ 1811Longest Common Substring
- SPOJ 题目 8222 NSUBSTR - Substrings(后缀自动机+DP求子串出现最大次数)
- 后缀自动机小结 (spoj 8222)
- PAT甲级1091
- 重新认识java(六) ---- java中的另类:static关键字(附代码块知识)
- 两个数之和
- Java并发编程的艺术 读笔
- 小鸦-拦截器和监听器,过滤器的区别
- [后缀自动机 模板题] SPOJ 8222 Substrings
- 对这一阶段C语言的总结
- 解决df -h 发现/目录100%的问题
- Openjudge NOI题库1.7编程基础之字符串 34:回文子串
- Shiro Quickstart
- 创建对象之原型模式
- 二叉树的镜像(二叉树的对称性)
- [最小循环表示 后缀自动机 模板题] BZOJ 2882 工艺
- 《ES6 标准入门》读书笔记