题目传送门

题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出。

思路:

  这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小。

  我们以$aabab$这个串距离,称作$S$串。

  首先我们要求出每一个状态对应的right集大小,S中的aab和ab此时并不在一个模式下,但他们属于一个right集,而ab是aab的父串,所以我们用拓扑排序的方式得到right集,这里的更新操作是$+$,因为ab对应的模式此时并没有包含aab中的ab。

  而得到right后,我们会发现在SAM上并没有一个单独的模式对应b,因为b被包含在了ab这个模式里面,所以我们也要用长度为2的答案来更新长度为1的答案,这里是取max,因为有可能是重复的,比如$abab$这样的串。

#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=;
char s[maxn];
int len[maxn<<],ch[maxn<<][],fa[maxn<<],tot=,root=,last=,siz,r[maxn<<];
int a[maxn<<],c[maxn<<],ans[maxn<<];
void extend(int x){
int now=++tot,pre=last;
r[now]=;
last=now,len[now]=len[pre]+;
while( pre && !ch[pre][x]){
ch[pre][x]=now;
pre=fa[pre];
}
if(!pre)fa[now]=root;
else{
int q = ch[pre][x];
if(len[q]==len[pre]+)fa[now]=q;
else {
int nows=++tot;
memcpy(ch[nows],ch[q],sizeof(ch[q]));
len[nows]=len[pre]+;
fa[nows]=fa[q];
fa[q]=fa[now]=nows;
while(pre&&ch[pre][x]==q){
ch[pre][x]=nows;
pre=fa[pre];
}
}
}
}
void topSort(){
for(int i=;i<=tot;i++)c[len[i]]++;
for(int i=;i<=tot;i++)c[i]+=c[i-];
for(int i=tot;i>;i--)a[c[len[i]]--]=i;
for(int i=tot;i>;i--)r[fa[a[i]]]+=r[a[i]];
}
int main(){
scanf("%s",s);
siz=strlen(s);
for(int i=;i<siz;i++)
{
int p=s[i]-'a';
extend(p);
}
topSort();
for(int i=;i<=tot;i++)ans[len[i]]=max(ans[len[i]],r[i]);
for(int i=siz-;i>;i--)ans[i]=max(ans[i+],ans[i]);
for(int i=;i<=siz;i++)printf("%d\n",ans[i]); }

hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机的更多相关文章

  1. hiho#1445 重复旋律5 求子串数量 后缀自动机

    题目传送门 题意:给出一个字符串,求子串的个数. 思路:后缀自动机的题真是每做一题就更理解一些. SAM中的每一状态$p$都代表了一种子串,而p包含的字符串的个数是$len[p]-len[fa[p]] ...

  2. hiho#1457 重复旋律7 求子串和 后缀自动机

    题目传送门 题意: 给出若干个串,求所有子串的和,子串和的定义为十进制数,取模1e9+7. 思路: 对于一个串来说,一个状态p就代表着$right$相同的集合,假设我们已经知道了状态p的$sum$,以 ...

  3. hihocoder 后缀自动机五·重复旋律8 求循环同构串出现的次数

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi发现旋律可以循环,每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以 ...

  4. hihocoder 1457 后缀自动机四·重复旋律7 求不同子串的和

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品 ...

  5. hihocoder-1419 后缀数组四·重复旋律4 求连续重复次数最多的子串

    对于重复次数,如果确定了重复子串的长度len,那重复次数k=lcp(start,start+len)/len+1.而暴力枚举start和len的复杂度是O(n^2),不能接受.而有一个规律,若我们只枚 ...

  6. hiho# 1465 重复旋律8 循环串计数 后缀自动机

    题目传送门 题意:给出一个母串,再给出n个串,问对于每个串,母串中有几个子串是可以通过循环变化得到这个串. 思路:对母串建SAM,求出$right$集. 把匹配串复制一遍,和母串进行匹配,当匹配长度大 ...

  7. hihocoder 后缀自动机四·重复旋律6

    题目 对于\(k\in[1,n]\)求出长度为\(k\)的子串出现次数最多的出现了多少次 我直到现在才理解后缀自动机上的子树和是什么意思 非常显然的一点是 \[endpos(link(u))⊇endp ...

  8. hiho一下123周 后缀数组四·重复旋律

    后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  9. hiho一下122周 后缀数组三·重复旋律

    后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

随机推荐

  1. 有些标签的class有多个值,用空格隔开的,是什么意思阿?

    这个div同时应用了三个class.三个class的设置都会对它起作用,相互冲突时,越后面的class优先权越高.

  2. Redis安装部署、Jedis的使用

    一.NoSQL概述 为什么需要NoSQL High performance -高并发读写 Huge Storage - 海量数据的高效率存储和访问 High Scalability && ...

  3. Mac完整卸载Android Studio的方法

    1.卸载Android Studio,在终端(terminal)执行以下命令: rm -Rf /Applications/Android\ Studio.app rm -Rf ~/Library/Pr ...

  4. centos7下查看tomcat是否启动/系统日志等

    centos7下查看tomcat是否启动/系统日志等  方法一: 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown ...

  5. HBase & thrift & C++编程

    目录 目录 1 1. 前言 1 2. 启动和停止thrift2 1 2.1. 启动thrift2 1 2.2. 停止thrift2 1 2.3. 启动参数 2 3. hbase.thrift 2 3. ...

  6. iperf 指令

    1. 测试UDP丢包率 30个现成以5Mbps速度测试60s iperf -u -c 目的IP -b 5M -P 30 -t 60 测试TCP丢包率 iperf -c 目的IP -b 5M -P 30 ...

  7. pycharm设置及激活码

    电脑上装了python2.7和python3.6两个版本(之前用的都是python3,因为要学习机器学习和深度学习了,机器学习的有些模块还没有更新到python3,于是乎又装了python2)为了能在 ...

  8. VUE 学习笔记 一 指令

    1.声明式渲染 v-bind 特性被称为指令.指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性 <div id='app'> <span v-bind:title=" ...

  9. EF按时间范围条件查询

    查询今日数据 db.Table.Where(d => System.Data.Entity.DbFunctions.DiffDays(d.Time, DateTime.Now) == )

  10. web 给大家分享一个好玩的东西,也许你那块就用的到

    先看效果: 就这个效果.当你点击右上角的删除按钮,会删除掉item1. 上代码: <!DOCTYPE html> <html> <head> <meta ch ...