洛谷P3808 【模板】AC 自动机(简单版)题解 AC自动机模板题
题目链接:https://www.luogu.com.cn/problem/P3808
AC自动机模板题。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
struct Node {
int son[26], fail, id;
Node() {}
Node(int _id) {
memset(son, 0, sizeof(son));
fail = 0;
id = _id;
}
} tr[maxn];
int n, cnt, cc[maxn];
char s[maxn];
void ins(char *s, int id) {
int u = 0;
for (; *s; s++) {
int c = (*s) - 'a';
if (!tr[u].son[c])
tr[ tr[u].son[c] = ++cnt ] = Node(0);
u = tr[u].son[c];
}
tr[u].id = id;
cc[u]++;
}
void build() {
queue<int> que;
for (int i = 0; i < 26; i++)
if (tr[0].son[i])
que.push(tr[0].son[i]);
while (!que.empty()) {
int u = que.front();
que.pop();
for (int i = 0; i < 26; i++) {
int v = tr[u].son[i];
if (!v) continue;
int x = tr[u].fail;
while (x && !tr[x].son[i])
x = tr[x].fail;
tr[v].fail = tr[x].son[i];
que.push(v);
}
}
}
bool vis[maxn];
int cal(char *s) {
int u = 0, cnt = 0;
for (; *s; s++) {
int c = (*s) - 'a';
while (u && !tr[u].son[c])
u = tr[u].fail;
if (tr[u].son[c])
u = tr[u].son[c];
if (tr[u].id && !vis[tr[u].id]) {
vis[tr[u].id] = true;
cnt += cc[u];
}
}
return cnt;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", s);
ins(s, i);
}
build();
scanf("%s", s);
printf("%d\n", cal(s));
return 0;
}
标签:
AC自动机
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2020-09-03 CF1238E.Keyboard Purchase 题解 状压/子集划分DP
2020-09-03 DP练习题 植物大战僵尸 题解 动态规划+费用提前计算