【SPOJ -NSUBSTR】Substrings 【后缀自动机+dp】
2024-09-14 21:38:52
题意
给出一个字符串,要你找出所有长度的子串分别的最多出现次数。
分析
我们建出后缀自动机,然后预处理出每个状态的cnt,cnt[u]指的是u这个状态的right集合大小。我们设f[len]为长度为len的子串的最多出现次数。我们对于自动机的每个状态都更新f,f[st[u].len]=max(f[st[u].len],cnt[u])。然后这样更新完以后,可以神奇的dp一下。f[len]=max(f[len],f[len+1]).想想为什么?
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=+;
char s[maxn];
int n;
struct state{
int len,link;
int ch[];
}st[maxn*];
int sz,last,cur,cnt[*maxn],c[*maxn],f[maxn];
void init(){
cur=last=;
sz=;
st[].link=-;
st[].len=;
memset(st[].ch,-,sizeof(st[].ch));
}
void build_sam(int c){
cur=sz++;
st[cur].len=st[last].len+;
cnt[cur]=;
memset(st[cur].ch,-,sizeof(st[cur].ch));
int p;
for(p=last;p!=-&&st[p].ch[c]==-;p=st[p].link)
st[p].ch[c]=cur;
if(p==-)
st[cur].link=;
else{
int q=st[p].ch[c];
if(st[q].len==st[p].len+)
st[cur].link=q;
else{
int clone=sz++;
st[clone].len=st[p].len+;
st[clone].link=st[q].link;
for(int i=;i<;i++)
st[clone].ch[i]=st[q].ch[i];
for(;p!=-&&st[p].ch[c]==q;p=st[p].link)
st[p].ch[c]=clone;
st[q].link=st[cur].link=clone;
}
}
last=cur;
}
int cmp(int a,int b){
return st[a].len>st[b].len;
}
int main(){
scanf("%s",s);
n=strlen(s);
init();
for(int i=;i<n;i++)
build_sam(s[i]-'a');
for(int i=;i<sz;i++)
c[i]=i;
sort(c,c+sz,cmp);
// for(int i=0;i<sz;i++){
// printf("%d\n",st[i].link);
// }
// printf("!!\n"); for(int i=;i<sz;i++){
int o=c[i];
cnt[st[o].link]+=cnt[o];
}
// for(int i=0;i<sz;i++)
// printf("%d ",cnt[i]);
// printf("\n"); for(int i=;i<sz;i++)
f[st[i].len]=max(f[st[i].len],cnt[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]);
}
return ;
}
最新文章
- 【Android进阶学习】shape和selector的结合使用(转)
- maven导入本地jar包
- 【C语言学习趣事】_32_平胸的尴尬,嫁不出去的姑娘
- win10中文简体繁体切换快捷键
- curl Protocol &#39;http not supported or disabled in libcurl
- sv_target_output dx11
- 什么是C#,.NET,ASP.NET?
- Ajax基础知识(二)
- 前端总结&#183;基础篇&#183;JS(一)五大数据类型之字符串(String)
- 论文翻译:Neural Networks With Few Multiplications
- 设计模式—装饰模式的C++实现
- getQueryStringByName url参数/
- 20155324 2016-2017-2 《Java程序设计》第1周学习总结
- HBuilder ,及自用主题
- PostgreSQL+PostGIS安装以及使用
- wordvec_词的相似度
- Asp.Net Core MVC控制器和视图之间传值
- win环境下使用sqlmap写shell + MYSQL提权(默认就是system权限)
- 十七、dbms_tts(检查表空间集合是否是自包含)
- css3 hover效果