SPOJ8222(后缀自动机--出现次数最多的子串)
来源:互联网 发布:ubuntu wily 源 编辑:程序博客网 时间:2024/06/01 09:57
题目:http://www.spoj.com/problems/NSUBSTR/
题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。求F(1)..F(Length(S))
#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>using namespace std;const int N=250005;struct State{ State *pre,*go[26]; int step,v; void clear() { v=0; pre=0; step=0; memset(go,0,sizeof(go)); }}*root,*last;State statePool[N*2],*b[2*N],*cur;void init(){ cur=statePool; root=last=cur++; root->clear();}void Insert(int w){ State *p=last; State *np=cur++; np->clear(); np->step=p->step+1; while(p&&!p->go[w]) p->go[w]=np,p=p->pre; if(p==0) np->pre=root; else { State *q=p->go[w]; if(p->step+1==q->step) np->pre=q; else { State *nq=cur++; nq->clear(); memcpy(nq->go,q->go,sizeof(q->go)); nq->step=p->step+1; nq->pre=q->pre; q->pre=nq; np->pre=nq; while(p&&p->go[w]==q) p->go[w]=nq, p=p->pre; } } last=np;}char str[N];int cnt[N];int dp[N];int main(){ int n,m; while(~scanf("%s",str)) { n=strlen(str); init(); for(int i=0; i<n; i++) Insert(str[i]-'a'); memset(cnt,0,sizeof(cnt)); for(State *p=statePool; p!=cur; p++) cnt[p->step]++; for(int i=1; i<=n; i++) cnt[i]+=cnt[i-1]; for(State *p=statePool; p!=cur; p++) b[--cnt[p->step]]=p; for(int i=0;i<n;i++) { int x=str[i]-'a'; root=root->go[x]; root->v++; } memset(dp,0,sizeof(dp)); int num=cur-statePool; for(int i=num-1;i>0;i--) { dp[b[i]->step]=max(dp[b[i]->step],b[i]->v); if(b[i]->pre) b[i]->pre->v += b[i]->v; } for(int i=n-1;i>0;i--) dp[i]=max(dp[i],dp[i+1]); for(int i=1;i<=n;i++) printf("%d\n",dp[i]); } return 0;}
- SPOJ8222(后缀自动机--出现次数最多的子串)
- 后缀自动机(子串个数)spoj8222
- 连续出现次数最多的子串—后缀数组
- 统计每个长度 出现的最多次数 后缀自动机 板子
- UVA 1449 Dominating Patterns (LA4670) 出现次数最多的子串 ac自动机
- AC自动机应用(2)LA 4670出现次数最多的子串
- AC自动机(出现次数最多的子串,LA 4670)
- 连续出现次数最多的子串
- 连续出现次数最多的子串
- 【spoj8222】Substrings 后缀自动机
- UVA 题目11512 - GATTACA(后缀数组求出现次数最多的子串及重复次数)
- 后缀自动机 重复旋律 6(长度为K的旋律中出现次数最多的旋律的出现次数)
- 后缀数组(重复次数最多的连续重复子串)
- spoj8222:Substrings 后缀自动机+DP
- 字符串中连续子串出现次数统计,获取连续出现次数最多的子串
- 一次遍历找出“出现次数最多的子串”
- 取得中文字符串中出现次数最多的子串
- 在字符串中查找出现次数最多的子串
- Demo-简单使用libcurl静态库访问网址
- 堆排序中--建堆的算法复杂度分析O(n)
- [安卓破解]听网页浏览器,无需注册即可语音朗读
- 第一个mapreduce
- 线性同余和扩展欧几里得的运用小结
- SPOJ8222(后缀自动机--出现次数最多的子串)
- Ubuntu 12.04 改造指南
- leetcode simplify path
- IREPORT 标签式报表
- NEERC 2006 / UVa 1388 Graveyard (数学&想法题&找最近整数)
- Linux12samba软件包
- 在Centos下使用英伟达GPU,文本模式下发现分辨率不能修改的方法
- UVA 10494 If We Were a Child Again
- 黑马程序员————高新技术————动态代理