UvalLive4670(AC自动机模板)
2024-08-28 18:00:20
放上刘汝佳的模板:
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
using namespace std; const int maxnod = * + ; int n;
char str[][], T[];
map<string, int> mp; struct AC_Automata {
int ch[maxnod][];//Trie树转移
int cnt[];//每个子串出现了几次
int val[maxnod];//某节点是否为子串结尾以及是哪个串的结尾
int f[maxnod];//失配,转移到别的树枝继续找
int last[maxnod];//找到了后缀相同的其他可行子串
int sz; void init() {
sz = ;
mp.clear();//与ac自动机无关
memset(ch[], , sizeof ch[]);
memset(cnt, , sizeof cnt);
} int idx(char c) { return c - 'a'; } void insert(char* s, int v) {//Trie树的插入
int u = , n =strlen(s);
for (int i = ; i < n; ++i) {
int c = idx(s[i]);
if (!ch[u][c]) {
memset(ch[sz], , sizeof ch[sz]);
val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
} void getfail() {
queue<int> Q;
f[] = ;
for (int i = ; i < ; i++) {
int u = ch[][i];
if (u) {
f[u] = last[u] = ;
Q.push(u);
}
}
while (!Q.empty()) {
int r = Q.front(); Q.pop();
for (int c = ; c < ; c++) {
int u = ch[r][c];
if (!u) continue;
Q.push(u);
int v = f[r];
while (v && !ch[v][c]) v = f[v];//当前这个不行看看别人行不行
f[u] = ch[v][c];
last[u] = val[f[u]] ? f[u] : last[f[u]];
}
}
} void Success(int j) {
if (j) {
cnt[val[j]]++;
Success(last[j]);
}
} void find(char* T) {
int n = strlen(T);
for (int i = , j = ; i < n; ++i) {
int c = idx(T[i]);
while (j && !ch[j][c]) j = f[j];
j = ch[j][c];
if (val[j]) Success(j);
else if (last[j]) Success(last[j]);
}
}
}ac; int main() {
while (~scanf("%d", &n) && n) {
ac.init();
for (int i = ; i <= n; i++) {
scanf("%s", str[i]);
ac.insert(str[i], i);
mp[str[i]] = i;
}
ac.getfail();
scanf("%s", T);
ac.find(T); int ans = -;
for (int i = ; i <= n; i++) {
ans = max(ans, ac.cnt[i]);
}
printf("%d\n", ans);
for (int i = ; i <= n; i++) {
if (ac.cnt[mp[str[i]]] == ans) puts(str[i]);
}
}
return ;
}
最新文章
- JSP之WEB服务器:Apache与Tomcat的区别 ,几种常见的web/应用服务器
- POJ1160 Post Office[序列DP]
- Java——新IO 缓冲区与Buffer
- 浅谈JavaScript中的闭包
- [转]Caffe在Linux下的安装,编译,实验
- 夺命雷公狗TP下关联查询
- LeetCode Median of Two Sorted Arrays 找中位数(技巧)
- vs 2005中解决找不到模板项
- Android 多线程 异步加载
- dialog获取焦点
- 【SICP感应】1 工艺和替代模式
- codeblocks设置代码黑色主题
- http协议发送post请求
- 学习MeteoInfo二次开发教程(八)
- JDBC(2)—Statement
- 基于 Spark 的文本情感分析
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)
- mdadm 软RAID
- 深入理解java虚拟机(八)类加载过程详解
- git之删除过滤
热门文章
- this、call和apply、bind
- layer弹出层不居中解决方案,仅显示遮罩,没有弹窗
- Python开发【2.2 异常处理】
- 三张图教你生成一个Android jar 库。
- intellij IDEA 更新java后不用重启tomcat
- 根据查询出各地订单商品数量 group by
- ie67 display:inline-block 失效解决方法
- ERROR: cannot start Android Studio. No JDK found. Please validate either ANDROID_STUDIO_JDK, JDK_HOME + Unrecognized VM option &#39;+UseCodeCacheFlushing
- (linux)MMC 卡驱动分析
- lstat函数的使用【学习笔记】