P3804 【模板】后缀自动机

后缀自动机模板

详情可见luogu题解板块

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll max(ll a,ll b){return a>b?a:b;}
#define N 2000005
struct Sam{
int nxt[N][],fa[N],len[N],siz[N];
int n,p,q,last,ed,c[N],a[N]; char s[N];//last:自动机的末尾点
Sam(){ed=;}
void init(){
scanf("%s",s+); n=strlen(s+);
for(int i=;i<=n;++i) add(s[i]-'a');
}
void add(int c){
p=last; len[last=++ed]=len[p]+; siz[ed]=;
for(;p&&!nxt[p][c];p=fa[p]) nxt[p][c]=ed;
if(!p){fa[ed]=; return ;}//case 1
q=nxt[p][c];
if(len[q]==len[p]+){fa[ed]=q; return ;}// case 2
len[++ed]=len[p]+;
memcpy(nxt[ed],nxt[q],sizeof(nxt[q]));
fa[ed]=fa[q]; fa[q]=fa[ed-]=ed;
for(;nxt[p][c]==q;p=fa[p]) nxt[p][c]=ed; // case 3
}
void calc(){
ll ans=;
for(int i=;i<=ed;++i) ++c[len[i]];
for(int i=;i<=ed;++i) c[i]+=c[i-];
for(int i=;i<=ed;++i) a[c[len[i]]--]=i;
for(int i=ed;i;--i){//按len的长度逆序处理(显然len[fa[x]]<len[x])
siz[fa[a[i]]]+=siz[a[i]];
if(siz[a[i]]>) ans=max(ans,1ll*siz[a[i]]*len[a[i]]);
}printf("%lld",ans);
}
}sam;
int main(){sam.init(); sam.calc(); return ;}

P3804 【模板】后缀自动机的更多相关文章

  1. 洛谷 P3804 [模板] 后缀自动机

    题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...

  2. [模板] 后缀自动机&&后缀树

    后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...

  3. Luogu3804:[模板]后缀自动机

    题面 luogu Sol \(sam\)然后树形\(DP\) 当时还不会拓扑排序的我 # include <bits/stdc++.h> # define IL inline # defi ...

  4. 洛谷 P3804 【模板】后缀自动机 统计单词出现次数

    后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...

  5. 【后缀自动机】洛谷P3804模板题

    题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...

  6. 洛谷P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...

  7. 【Luogu3804】【模板】后缀自动机(后缀自动机)

    [Luogu3804][模板]后缀自动机(后缀自动机) 题面 洛谷 题解 一个串的出现次数等于\(right/endpos\)集合的大小 而这个集合的大小等于所有\(parent\)树上儿子的大小 这 ...

  8. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

  9. 2018.07.17 后缀自动机模板(SAM)

    洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写. 代码如下: #include<bits/stdc++.h> #define N 2000005 #d ...

随机推荐

  1. Mac上安装PHP、Apache、MySQL

    Mac自带php5.6版本,要升级到php7.3 步骤如下 1,brew 安装php ,如果没有安装,访问https://brew.sh/index_zh-cn安装在终端输入以下内容,不用指定安装ph ...

  2. [LeetCode] 596. Classes More Than 5 Students_Easy tag:SQL

    There is a table courses with columns: student and class Please list out all classes which have more ...

  3. WebAPI安全

    1.Oauth Oauth2.0各语言版本公认框架https://oauth.net/code/

  4. JMeter开发插件——图片验证码识别

    我们在性能测试中总会时不时地遭遇到来自于应用系统的各种阻碍,图片验证码就是一类最常见的束缚,登录或交易时需要按照图片中的内容输入正确的验证信息后,数据才可以提交成功,这使得许多性能测试工具只能望而却步 ...

  5. HDU 4686 Arc of Dream(矩阵)

    Arc of Dream [题目链接]Arc of Dream [题目类型]矩阵 &题解: 这题你做的复杂与否很大取决于你建的矩阵是什么样的,膜一发kuangbin大神的矩阵: 还有几个坑点: ...

  6. JavaScript-switch-case运用-案例

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. Spring中集合注入方法

    集合注入重要是对数组.List.Set.map的注入,具体注入方法请参照一下代码(重点是applicationContext.xml中对这几个集合注入的方式): 1.在工程中新建一个Departmen ...

  8. 导入转储文件的时候:Error Code: 1406. Data too long for column - MySQL

    MySQL will truncate any insert value that exceeds the specified column width. to make this without e ...

  9. [转]js刷新父窗体

    浮层内嵌iframe及frame集合窗口,刷新父页面的多种方法   <script language=JavaScript>       parent.location.reload(); ...

  10. I/O流的概念和流类库的结构

    概念: 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 1.对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到 ...