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 【模板】后缀自动机的更多相关文章
- 洛谷 P3804 [模板] 后缀自动机
题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...
- [模板] 后缀自动机&&后缀树
后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...
- Luogu3804:[模板]后缀自动机
题面 luogu Sol \(sam\)然后树形\(DP\) 当时还不会拓扑排序的我 # include <bits/stdc++.h> # define IL inline # defi ...
- 洛谷 P3804 【模板】后缀自动机 统计单词出现次数
后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...
- 【后缀自动机】洛谷P3804模板题
题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...
- 洛谷P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...
- 【Luogu3804】【模板】后缀自动机(后缀自动机)
[Luogu3804][模板]后缀自动机(后缀自动机) 题面 洛谷 题解 一个串的出现次数等于\(right/endpos\)集合的大小 而这个集合的大小等于所有\(parent\)树上儿子的大小 这 ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
- 2018.07.17 后缀自动机模板(SAM)
洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写. 代码如下: #include<bits/stdc++.h> #define N 2000005 #d ...
随机推荐
- powerdesign连接Oracle&Mysql
Oracle部分 想用powerDesign,需要用到oracle数据库,记录配置过程 1,安装win64_11gR2_client,选择安装方式为管理员,按默认选安装,过程大概几分钟就好 2,配置客 ...
- 2019.04.09 电商19 分析carmanage.py
post(self,request)这个request是干嘛的 有是递归,他调用了那个getcarmanager函数返回的是另一个函数. 这另一个函数负责创建插入数据 def __init__(sel ...
- CentOS6.5安装Scrapy
1.安装命令超级简单: [root@mycentos ~]# pip install Scrapy 建立软链接: [root@mycentos ~]# ln -s /usr/local/python3 ...
- 函数 return
return 的作用 一.返回一个值给函数,主函数调用这个函数后能得到这个返回的值.二.结束函数,例如你运行到一个地方,虽然后面还有代码但是你不想再继续运行,这时就可以直接用 return:这条语句来 ...
- cocos2d JS-(JavaScript) 基础语法间的函数方法相互调用
1.函数嵌套函数 function calcuate(opr, a, b) { // 定义函数,opr - -> 符号,a,b - -> 数值 //定义 + 函数 function add ...
- openCV学习——一、图像读取、显示、输出
openCV学习——一.图像读取.显示.输出 一.Mat imread(const string& filename,int flags=1),用于读取图片 1.参数介绍 filename ...
- UVA 11178 Morley's Theorem(几何)
Morley's Theorem [题目链接]Morley's Theorem [题目类型]几何 &题解: 蓝书P259 简单的几何模拟,但要熟练的应用模板,还有注意模板的适用范围和传参不要传 ...
- 018-AJAX异步请求XMLHttpRequest
创建XMLHttpRequest对象 一.先来创建XMLHttpRequest对象在IE.Firefox.safari和Opera中创建该对象的JavaScript代码为: var xhr = new ...
- git 开发中的总结
一.git是什么 1.git是一种分布式的版本管理系统, 分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库. 二.g ...
- Android -- GreenDao3.2的简单使用
1,最近看了一篇文章关于GreenDao的文章 ,感觉使用这个操作数据库还是很好用的,帮我们省了不少的查询代码,今天就和大家一起来简单的使用一下吧.首先这是官网地址:https://github.co ...