普通 \(\text{SAM Code}\)

#include <cstdio>
#include <iostream>
#include <cstring>
#define IN inline
using namespace std; template <typename T>
IN void read(T &x) {
x = 0; char ch = getchar(); int f = 0;
for(; !isdigit(ch); f = (ch == '-' ? 1 : f), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
if (f) x = ~x + 1;
} typedef long long LL;
const int N = 2e6 + 5;
int n;
char str[N];
LL ans; struct SAM {
int fa[N], len[N], ch[N][26], lst, sz[N], size;
IN SAM(){size = lst = 1;}
IN void insert(int c) {
int p = lst, np = lst = ++size;
len[np] = len[p] + 1, sz[np] = 1;
for(; p && !ch[p][c]; p = fa[p]) ch[p][c] = np;
if (!p) {fa[np] = 1; return;}
int q = ch[p][c];
if (len[q] == len[p] + 1) {fa[np] = q; return;}
int nq = ++size;
for(int i = 0; i < 26; i++) ch[nq][i] = ch[q][i];
len[nq] = len[p] + 1, fa[nq] = fa[q], fa[np] = fa[q] = nq;
for(; p && ch[p][c] == q; p = fa[p]) ch[p][c] = nq;
}
int h[N], tot;
struct edge{int to, nxt;}e[N];
IN void add(int x, int y){e[++tot] = edge{y, h[x]}, h[x] = tot;}
void buildPT() {
for(int i = 2; i <= size; i++) add(fa[i], i);
}
void dfs(int x) {
for(int i = h[x]; i; i = e[i].nxt) dfs(e[i].to), sz[x] += sz[e[i].to];
if (sz[x] > 1) ans = max(ans, (LL)sz[x] * len[x]);
}
}T; int main() {
scanf("%s", str + 1), n = strlen(str + 1);
for(int i = 1; i <= n; i++) T.insert(str[i] - 'a');
T.buildPT(), T.dfs(1), printf("%lld\n", ans);
}

广义 \(\text{SAM Code}\)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define IN inline
using namespace std; template <typename T>
IN void read(T &x) {
x = 0; char ch = getchar(); int f = 0;
for(; !isdigit(ch); f = (ch == '-' ? 1 : f), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
if (f) x = ~x + 1;
} typedef long long LL;
const int N = 2e6 + 5;
int n, id[N];
char str[N];
LL ans; struct SAM {
int fa[N], len[N], ch[N][26], size;
IN SAM(){size = 1;}
IN void insert(int lst, int c, int now) {
int p = lst, np = ++size; id[now] = np;
len[np] = len[p] + 1;
for(; p && !ch[p][c]; p = fa[p]) ch[p][c] = np;
if (!p) fa[np] = 1;
else {
int q = ch[p][c];
if (len[q] == len[p] + 1) fa[np] = q;
else {
int nq = ++size;
for(int i = 0; i < 26; i++) ch[nq][i] = ch[q][i];
len[nq] = len[p] + 1, fa[nq] = fa[q], fa[np] = fa[q] = nq;
for(; p && ch[p][c] == q; p = fa[p]) ch[p][c] = nq;
}
}
ans += len[np] - len[fa[np]];
}
}S; struct Trie {
int size = 1, tr[N][26], fa[N];
IN void insert() {
int u = 1, m = strlen(str + 1);
for(int i = 1; i <= m; i++) {
int c = str[i] - 'a';
if (!tr[u][c]) tr[u][c] = ++size;
fa[tr[u][c]] = u, u = tr[u][c];
}
}
queue<int> Q;
IN void bfs() {
Q.push(1), id[1] = 1;
while (!Q.empty()) {
int now = Q.front(); Q.pop();
for(int i = 0; i < 26; i++)
if (tr[now][i]) S.insert(id[now], i, tr[now][i]), Q.push(tr[now][i]);
}
}
}T; int main() {
read(n);
for(int i = 1; i <= n; i++) scanf("%s", str + 1), T.insert();
T.bfs(), printf("%lld\n", ans);
}

P3804 【模板】后缀自动机 (SAM) && P6139 【模板】广义后缀自动机(广义 SAM)的更多相关文章

  1. 后缀自动机(SAM)+广义后缀自动机(GSA)

    经过一顿操作之后竟然疑似没退役0 0 你是XCPC选手吗?我觉得我是! 稍微补一点之前丢给队友的知识吧,除了数论以外都可以看看,为Dhaka和新队伍做点准备... 不错的零基础教程见 IO WIKI ...

  2. BZOJ 3473: 字符串 [广义后缀自动机]

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 354  Solved: 160[Submit][Status][Discuss] ...

  3. POJ3294Life Forms(广义后缀自动机)(后缀数组+二分+数状数组)

    You may have wondered why most extraterrestrial life forms resemble humans, differing by superficial ...

  4. CodeForces-204E:Little Elephant and Strings (广义后缀自动机求出现次数)

    The Little Elephant loves strings very much. He has an array a from n strings, consisting of lowerca ...

  5. BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  6. 【BZOJ3227】串【广义后缀自动机】

    题意 给出n个字符串,问每个字符串中有多少子串是这所有的n个字符串中至少k个的子串. 分析 广义后缀自动机模板题.对这n个串建广义后缀自动机,对于每个状态维护两个值cou[u]和lcu[u]分别代表拥 ...

  7. SPOJ8093Sevenk Love Oimaster(广义后缀自动机)

    Oimaster and sevenk love each other.     But recently,sevenk heard that a girl named ChuYuXun was da ...

  8. bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解

    先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...

  9. BZOJ 3926 && ZJOI 2015 诸神眷顾的幻想乡 (广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽 ...

  10. BZOJ 3277 串 (广义后缀自动机)

    3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...

随机推荐

  1. 解决Linux使用deepin-wine跑qq,tim打不开文件所在文件夹

    前言 使用deepin-wine 跑qq,发现一个小bug 这里点击打开文件夹是没有效果的,包括在 tim 上也是这样 问题原因 出现这个问题是因为 deepin-wine 跑的 QQ,Tim 打开文 ...

  2. 【Java并发入门】03 互斥锁(上):解决原子性问题

    原子性问题的源头是线程切换 Q:如果禁用 CPU 线程切换是不是就解决这个问题了? A:单核 CPU 可行,但到了多核 CPU 的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问题. 所 ...

  3. 4.9:MapReduce之WordCount

    〇.概述 1.拓扑结构 2.目标 使用hadoop的MapReduce来实现计数. 一.启动服务 二.新建计算的文件 三.上传文件 四.分析文件 cd ~/bigdatahadoop jar Word ...

  4. 【大数据课程】高途课程实践-Day02:利用Hive SQL编写离线数仓实现可视化展示

    〇.概述 1.实现内容 使用Hive SQL编程,构造分层离线数仓 并可以通过Quick Bi进行展示 2.过程 (1)数据接⼊到ODS层 (2)进⾏ODS到DWD层数据开发 (3)进⾏ODS到DIM ...

  5. 【每日一题】【回溯】【StringBuilder】2021年12月7日-17. 电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 来源:力扣(LeetCode)链 ...

  6. SQL审核平台Yearning

    1.关于Yearming Yearming是一个Sql审核平台,底层使用Go语言,安装和部署方式也很便捷 项目地址 https://guide.yearning.io/install.html git ...

  7. Chaos 测试下的若干 NebulaGraph Raft 问题分析

    Raft 是一种广泛使用的分布式共识算法.NebulaGraph 底层采用 Raft 算法实现 metad 和 storaged 的分布式功能.Raft 算法使 NebulaGraph 中的 meta ...

  8. java定时任务Quartz整理

    目录 一.Quartz介绍 二.Quartz的组成 三.使用java实现一个简单的Quartz例子 四.使用Springboot整合Quartz定时任务框架 五.使用Springboot+mybati ...

  9. 关于asp.net mvc的控制器的依赖注入思考及对StructureMap依赖注入框架的简单实践笔记

    写在前面: 依赖注入这个玩意很多人其实都接触过,但可能没有细究其中的原理. 比如Controller的构造函数中,只要你传入一些接口,应用自动就给你处理了创建的过程,无需你手动去new 一个实例并穿进 ...

  10. MS17-010漏洞复现(永恒之蓝)

    0x01:温馨提示 微软已于2017 年 发布MS17-010补丁,修复了"永恒之蓝"攻击的系统漏洞,一定要及时更新Windows系统补丁. 本次只是简易的复现MS17-010,成 ...