[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 ...
随机推荐
- 问题 E: Problem B
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> ...
- Log4net实用说明
Log4net实用说明 Appender Filter Layout Logger ObjectRender Repository PatterLayout格式化字符表 配置文件说明 Appender ...
- Codeforce 25A - IQ test (唯一奇偶)
Bob is preparing to pass IQ test. The most frequent task in this test is to find out which one of th ...
- Spark Streaming:updateStateByKey报错 is not applicable for the arguments...
ones.updateStateByKey(new Function2<List<Integer>, Optional<Integer>, Optional<Int ...
- Jenkins +Ant +Jmeter(apache-jmeter-5.1.1)自动化性能测试平台
1.安装配置好Jdk, 下载网址:https://www.cr173.com/soft/33894.html 2.Jmeter下载地址:http://jmeter.apache.org/downloa ...
- [十二省联考2019] 异或粽子 - 可持久化Trie,堆
求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大. Solution (差点又看错题了) 做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对 建一棵可持久化 ...
- linux - 从网上下载文件到服务器
命令格式 wget URL地址 实例 wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86 ...
- docker-machine之升级linux内核
虚拟机版本及内核信息 uname -a 或者 uname -r 开始升级内核 1.更新yum源 yum -y update 2,获取内核信息 rpm --import https://www.elre ...
- 牛客多校第七场H Pair 数位dp理解
Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...
- Linux_oracle 数据库监听
su - oracle //切换到oracle用户模式下 cd $ORACLE_home/bin //进入oracle安装目录 lsnrctl start //启动监听 lsnrctl status ...