Luogu P3804 【模板】后缀自动机
注意空间开两倍
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
template<class T>inline void read(T &num) {
register char ch; register int flg = 1;
while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar());
num *= flg;
}
const int MAXN = 1000005;
const int C = 26;
struct SAM {
int sz, last, len[MAXN<<1], link[MAXN<<1], ch[MAXN<<1][C], size[MAXN<<1];
inline void init() {
sz = last = 0;
len[0] = size[0] = 0;
link[0] = -1;
++sz;
//memset(ch, 0, sizeof ch);
}
inline void insert(int c) {
int cur = sz++, p;
len[cur] = len[last] + 1;
size[cur] = 1;
for(p = last; ~p && !ch[p][c]; p = link[p]) ch[p][c] = cur;
if(p == -1) link[cur] = 0;
else {
int q = ch[p][c];
if(len[p] + 1 == len[q]) link[cur] = q;
else {
int clone = sz++;
len[clone] = len[p] + 1;
link[clone] = link[q];
memcpy(ch[clone], ch[q], sizeof ch[q]);
for(; ~p && ch[p][c] == q; p = link[p]) ch[p][c] = clone;
link[cur] = link[q] = clone;
}
}
last = cur;
}
}sam;
int n, seq[MAXN<<1], cnt[MAXN];
int main() {
char ch; sam.init();
while((ch=getchar())!='\n') ++n, sam.insert(ch-'a');
for(int i = 0; i < sam.sz; ++i) ++cnt[sam.len[i]];
for(int i = 1; i <= n; ++i) cnt[i] += cnt[i-1];
for(int i = sam.sz-1; ~i; --i) seq[cnt[sam.len[i]]--] = i;
LL ans = 0;
for(int i = sam.sz; i > 1; --i) {
sam.size[sam.link[seq[i]]] += sam.size[seq[i]];
if(sam.size[seq[i]] > 1) //题目要求出现次数大于1
ans = max(ans, 1ll * sam.len[seq[i]] * sam.size[seq[i]]);
}
printf("%lld\n", ans);
}
Luogu 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 【模板】后缀自动机
P3804 [模板]后缀自动机 后缀自动机模板 详情可见luogu题解板块 #include<iostream> #include<cstdio> #include<cs ...
- 洛谷 P3804 【模板】后缀自动机 统计单词出现次数
后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...
- 【后缀自动机】洛谷P3804模板题
题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...
- 洛谷P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...
- luogu 3804 【模板】后缀自动机
学习一波后缀自动机 求字符串$S$的所有出现次数不为1的子串的出现次数乘上该子串长度的最大值 #include<iostream> #include<cstdio> #incl ...
- 【Luogu3804】【模板】后缀自动机(后缀自动机)
[Luogu3804][模板]后缀自动机(后缀自动机) 题面 洛谷 题解 一个串的出现次数等于\(right/endpos\)集合的大小 而这个集合的大小等于所有\(parent\)树上儿子的大小 这 ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
随机推荐
- IDEA安装Git
1.下载Git 官方地址为:https://git-scm.com/download/win 2.下载完之后,双击安装 3.选择安装目录 4.选择组件 5.开始菜单目录名设置 6.选择使用命令行环境 ...
- 在Docker Container 内部安装 Mono 的方法 ---From官网
1.首先 mono 是什么 Mono是一个由Xamarin公司(先前是Novell,最早为Ximian)所主持的自由开放源代码项目. 该项目的目标是创建一系列匹配ECMA标准(Ecma-334和Ecm ...
- joda-time使用
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Java时间处理
java.sql.PreparedStatement接口的setDate(int parameterIndex, java.sql.Date x)方法中的Date为java.sql包下的Date,而不 ...
- GitHub访问及git工具克隆慢问题解决
一.查询合适的DNS服务器 1.站长工具DNS查询服务器 github.com github.global.ssl.fastly.net 2.选择TTL值最小的记录,记录下对应服务器IP地址 例如 g ...
- 初遇PHP(一)
因为想给自己弄一个微信公众号,顺便提升一下自己,所以有了以下内容,本次学习的最终目标是能用php制作套微信公众号,然后转成Java.为什么要这么麻烦呢,其一是买的资料书是php的,其二是顺水推舟刚好可 ...
- Java EE Servlet相关的两个包
Servlet in Java EE 在Java EE的规范API中(链接),Servlet相关联的最重要的两个Package为: 1.javax.servlet 包含了一系列接口和类,他们在一个Se ...
- Java实现的基础数据结构
Java实现的基础数据结构 0,常用的基础数据结构 图1 基础数据结构&相关特性 图2 Java自带的类集框架&继承关系图 1,数组[Array] 特点:长度固定.查找方便[直接使用i ...
- c#获取桌面路径和bin文件的路径
string path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory): 生成的运行bin文件下的路径: ...
- spring 多数据源配置
多数据源配置方法: 在配置数据源配置文件中多加一个数据源配置即可: <bean id="dataSource" class="org.apache.commons. ...