[Note]后缀自动机
后缀自动机
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
const int M = 1e6 + 10;
const int N = 5e5 + 10;
char s[N];
int trns[M][26], pa[M], mxl[M], mnl[M], gr[M], ep[M];
int len, n;
int tmp[N], rnk[M];
inline int nwst(int mx, int mn, int *tr, int sl) {
mxl[n] = mx; mnl[n] = mn; pa[n] = sl;
for (int i = 0; i < 26; ++i) {
if (tr == NULL) trns[n][i]=-1;
else trns[n][i] = tr[i];
}
return n++;
}
inline void link(int x, int y) {
mnl[x] = mxl[y]+1; pa[x] = y; deg[y]++;
}
inline int addc(int c, int u) {
int z = nwst(mxl[u]+1, -1, NULL, -1);
gr[z] = 1;
while (u != -1 && trns[u][c] == -1) {
trns[u][c] = z;
u = pa[u];
}
if (u == -1) {
link(z, 0);
return z;
}
int x = trns[u][c];
if (mxl[x] == mxl[u]+1) {
link(z, x);
return z;
}
int y = nwst(mxl[u]+1, mnl[x], trns[x], pa[x]);
link(x, y);
link(z, y);
while (u != -1 && trns[u][c] == x) {
trns[u][c] = y;
u = pa[u];
}
return z;
}
inline void build() {
int u = nwst(0, 0, NULL, -1);
for (int i = 0; i < len; ++i) u = addc(s[i]-'a', u);
for (int i = 0; i < n; ++i) tmp[mxl[i]]++;
for (int i = 1; i <= len; ++i) tmp[i] += tmp[i-1];
for (int i = 0; i < n; ++i) rnk[tmp[mxl[i]]--] = i;
for (int i = n; i; --i) {
int &j = rnk[i];
ep[j] += gr[j];
if (pa[j] != -1) ep[pa[j]] += ep[j];
}
ep[0] = 0;
}
解释
mxln
: \(maxlen\)
mnln
: \(minlen\)
ep
: \(|endpos|\)
trns
: \(trans\)
pa
: \(suffixLink\)
应用
不同子串的数目问题
\(\sum_{i\in (0,n)} (maxlen_i-minlen_i+1)\)
最多k长子串问题
\(|endpos|\)即为某个节点所包含的串的出现次数。由于答案数组递减,只需要更新每个状态的\(|maxlen|\)对应的答案,最后再调整答案即可。
for (int i = 1; i < n; ++i)
ans[mxln[i]] = std::max(ans[mxln[i]], ep[i]);
for (int i = len-1; i; --i)
ans[i] = std::max(ans[i], ans[i+1]);
[Note]后缀自动机的更多相关文章
- 字符串(后缀自动机):Codeforces Round #129 (Div. 1) E.Little Elephant and Strings
E. Little Elephant and Strings time limit per test 3 seconds memory limit per test 256 megabytes inp ...
- [模板] 后缀自动机&&后缀树
后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...
- CodeForces - 616F:Expensive Strings (后缀自动机)
You are given n strings ti. Each string has cost ci. Let's define the function of string , where ps, ...
- POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串
A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...
- BZOJ 后缀自动机四·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- 【Codeforces235C】Cyclical Quest 后缀自动机
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【BZOJ-3998】弦论 后缀自动机
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2018 Solved: 662[Submit][Status] ...
- HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)
Reincarnation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
随机推荐
- IndexedDB基本概念
控制台 IndexedDB下为数据库 数据库下为表,表内容展现为主键值和其余值,其中其余值包括索引和其他任意字段,以对象形式表现 表下为索引字段表,用来展现拥有同一种索引字段的所有数据(有多少种索引就 ...
- 《深入理解java虚拟机》读书笔记九——第十章
第十章 早期(编译期)优化 1.Javac的源码与调试 编译期的分类: 前端编译期:把*.java文件转换为*.class文件的过程.例如sun的javac.eclipseJDT中的增量编译器. JI ...
- redis分布式锁在springboot中的实现
理论知识 redis分布式锁的实现方案请参考文章 如何优雅地用redis实现分布式锁 本案例简介 以秒杀活动为例子,在多线程高并发的情况下需要保证秒杀业务的线程安全性,确保秒杀记录与所扣库存数 ...
- 白面系列 redis
redis是Key-Value数据库,和Memcached类似.value可以是多种类型,如Strings, Lists, Hashes, Sets 及 Ordered Sets等. redis一个牛 ...
- 手机内存卡RAW无法格式化的解决办法
突然出现这个问题,这是麻烦: 网上找了各种办法:什么软件修复,disk等修复,创建新磁盘,新扇到,win自动修复啊:开始----运行框中输入 :convert X: /fs:FAT(X为电脑 ...
- 顶级Kagglers的心得和技巧
这是一篇笔记,课程来自Coursera上的How to Win a Data Science Competition: Learn from Top Kagglers 本篇可以算是顶级Kaggler大 ...
- OpenCV中imread失败cvLoadImage成功
MYLAF 环境说明 编程环境:Windows 10(64bit), VS2013, OpenCV 2.4.12; 编程语言:C/C++: MYLAF 现象 在代码中,调用imread读取图片失败,但 ...
- C++-POJ2955-Brackets[DP]
题意就是,找出最长合法子括号序列 容易想到设f[l][r]为l~r的最长合法子括号序列的长度 然后从短的状态往长的状态枚举,不断更新答案就可以了 //#include<bits/stdc++.h ...
- html 动态生成
function func_creatediv(item, index, input) { var ip = document.createElement("div"); ip.n ...
- SSM开发基于Java EE在线图书销售系统
SSM(Spring+Spring MVC+MyBatis)开发基于Java EE在线图书销售系统 网站成功建立和运行很大部分取决于网站开发前的规划,因此为了在网站建立过程中避免一些不 ...