后缀自动机

代码

#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]后缀自动机的更多相关文章

  1. 字符串(后缀自动机):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 ...

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

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

  3. CodeForces - 616F:Expensive Strings (后缀自动机)

    You are given n strings ti. Each string has cost ci. Let's define the function of string , where ps, ...

  4. POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串

    A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...

  5. BZOJ 后缀自动机四·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...

  6. 【Codeforces235C】Cyclical Quest 后缀自动机

    C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...

  7. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  8. 【BZOJ-3998】弦论 后缀自动机

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2018  Solved: 662[Submit][Status] ...

  9. HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

随机推荐

  1. 5.Docker Compose 部署 Harbor

    什么是 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docker Dis ...

  2. CTS、CLS、CLR

    CTS.CLS和CLR是.NET框架的3个核心部分,下面分别对它们进行介绍. 1)CTS  Common Type System CTS即通用类型系统,它定义了如何在.NET Framework运行库 ...

  3. 我的翻译--一个针对TP-Link调试协议(TDDP)漏洞挖掘的故事

    前言 我写这篇文章原本是为了简化WiFi渗透测试研究工作.我们想使用去年由Core Security发布的WIWO,它可以在计算机网络接口和WiFi路由器之间建立一个透明的通道. 研究的第一步,就是选 ...

  4. 《你不知道的javascript(上)》笔记

    作用域是什么 编译原理 分词/词法分析 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元 解析/语法分析 词法单元流(数组)转换成一个由元素逐级嵌套所组成 ...

  5. ST表求区间最值

    #include<bits/stdc++.h> #define ll long long #define lowbit(x) x&-x using namespace std; ; ...

  6. 【翻译】Facebook全面推出Watch Party,可多人线上同看直播视频

    今天, Facebook全面推出Watch Party——多人共同观看直播功能,用户可以同时查看和评论同一视频. Watch Party先前已在群组中推出,并且正在测试其他类型的帐户.但现在任何个人资 ...

  7. ASP.NET Razor 常用示例

    1.在网页中显示@符号 使用@@即可使编译器不切换到c#,这样在网页中会显示一个@符号. 2.隐式表达式 也就是正常的razor语法,不能包含空格.(除了await 如:<p>@await ...

  8. [SDOI2013] 直径 - 树形dp

    对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...

  9. [TJOI2013] 拯救小矮人- 贪心,dp

    结论:矮的人比高的人先走一定不会使得答案变劣 于是我们排序后,像 0-1 背包那样依次考虑每个人走不走 #include <bits/stdc++.h> using namespace s ...

  10. 白面系列 mongoDB

    mongoDB和redis一样,都是noSQL技术之一. redis是Key-Value存储,mongoDB是文档存储. 文档存储一般用类似json的格式存储,存储的内容是文档型的.文档是一组键值(k ...