[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 ...
随机推荐
- HW - VCN 介绍
VCN 是个管理摄像机的平台 用来增删改查摄像机,获取摄像机视频流,获取录像 vcn会基于我们的接口做一次开发,作为相机的统一管理入口,获取相机的信息
- Mysql中FIND_IN_SET()和IN区别简析
来源:http://www.jb51.net/article/125744.htm 测试SQL: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_inc ...
- 文本harry potter的字符统计
实现计算文件中字符的占比和不同单词的个数两项功能,首先将文本文件按行导入到程序中,再通过charAT()函数来实现对单个字符的操作,并用集合来统计字符总数以及不同的字符的个数,进而输出各个字符的个数以 ...
- Ionic 使用 NFC
Ionic 使用 NFC 哎哟喂,因为项目需要使用 Ionic 调用手机 NFC 功能,踩了好多坑,真的是,不过终于不负众望拿到了id.现在就记录一下我的步骤和踩过的坑! 步骤 我装的Ionic可能是 ...
- [CQOI2009] 中位数 - 桶
给出 \(1~n\) 的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 \(b\).中位数是指把所有元素从小到大排列后,位于中间的数. Solution (这个题为什么会被打上数学标签? ...
- Winform form窗体已弹出框的形式出现并回传值
From2(弹出框)回传数据到From1 Form1(数据接收form): public string Sstr; private void button1_Click(object sender, ...
- Web 开发人员推荐的通用独立 UI 组件
现代 Web 开发在将体验和功能做到极致的同时,对于美观的追求也越来越高.在推荐完图形库之后,再来推荐一些精品的独立 UI 组件.这些组件可组合在一起,形成美观而交互强大的 Web UI . 给 We ...
- HTML span标签
span:行内标签,不会换行用于:组合文档中的行内元素.元素和文档的组合
- ReLU(inplace=True),这里的inplace=true的意思
ReLU(inplace=True),这里的inplace=true的意思 待办 inplace=True means that it will modify the input directly, ...
- 【PAT甲级】1117 Eddington Number (25分)
题意: 输入一个正整数N(<=100000),接着输入N个非负整数.输出最大的整数E使得有至少E个整数大于E. AAAAAccepted code: #define HAVE_STRUCT_TI ...