洛谷-P3796-【模板】AC自动机(加强版)
题目传送门
-------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题
sol:AC自动机,在fail边的基础上再加一个last边,指向真正有效的节点,跳fail边改成跳last边来跳过无效点。
- AC自动机
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MAXN = ;
struct Trie {
int son[MAXN][], fail[MAXN], last[MAXN];
int cnt[MAXN], inde[MAXN]; int tot, root, _max;
vector<int> vec; string str[];
int add_node() {
memset(son[tot], -, sizeof(son[tot]));
cnt[tot] = ; inde[tot] = -;
return tot ++;
}
void init() {
tot = _max = ;
root = add_node();
}
void insert(char* s, int id) {
int p = root;
for (int i = ; s[i]; i++) {
int index = s[i] - 'a';
if (son[p][index] == -)
son[p][index] = add_node();
p = son[p][index];
}
inde[p] = id;
str[id] = s;
}
void build() {
queue<int> que;
fail[root] = last[root] = root;
for (int i = ; i < ; i++) {
if (son[root][i] == -) son[root][i] = root;
else {
fail[son[root][i]] = root;
last[son[root][i]] = root;
que.push(son[root][i]);
}
}
while (!que.empty()) {
int p = que.front(); que.pop();
for (int i = ; i < ; i++) {
if (son[p][i] == -) son[p][i] = son[fail[p]][i];
else {
fail[son[p][i]] = son[fail[p]][i];
if (inde[son[fail[p]][i]] != -)
last[son[p][i]] = son[fail[p]][i];
else
last[son[p][i]] = son[last[p]][i];
que.push(son[p][i]);
}
}
}
}
void slove(char* s) {
int p = root;
for (int i = ; s[i]; i++) {
int index = s[i] - 'a';
p = son[p][index];
for (int tmp = p; tmp != root; tmp = last[tmp]) {
if (inde[tmp] == -) continue;
cnt[tmp] ++;
if (cnt[tmp] > _max) {
_max = cnt[tmp];
vec.clear();
vec.push_back(inde[tmp]);
} else if (cnt[tmp] == _max) {
vec.push_back(inde[tmp]);
}
}
}
}
void output() {
printf("%d\n", _max);
sort(vec.begin(), vec.end());
for (int i = ; i < vec.size(); i++)
cout << str[vec[i]] << endl;
}
} ac;
char s[];
int main() {
int n;
while (scanf("%d", &n) && n) {
ac.init();
for (int i = ; i <= n; i++) {
scanf("%s", s);
ac.insert(s, i);
}
ac.build(); scanf("%s", s);
ac.slove(s); ac.output();
}
return ;
}
洛谷-P3796-【模板】AC自动机(加强版)的更多相关文章
- 洛谷 - P3966 - 单词 - AC自动机
https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
- 洛谷 - P2444 - 病毒 - AC自动机
https://www.luogu.org/problemnew/show/P2444 有点恶心,不太明白fail的意义. #include<bits/stdc++.h> using na ...
- 洛谷 P3804 [模板] 后缀自动机
题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P1120 小木棍 [数据加强版](搜索)
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...
- 洛谷P3796 - 【模板】AC自动机(加强版)
原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...
- 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)
洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...
- 洛谷 P3796 【模板】AC自动机(加强版)(AC自动机)
题目链接:https://www.luogu.com.cn/problem/P3796 AC自动机:复杂度$O( (N+M)\times L )$,N为模式串个数,L为平均长度,M为文章长度. ins ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
随机推荐
- C# ASP 面试题 2017
在博客上看到的,感觉还不错 https://www.cnblogs.com/renyiqiu/p/6435261.html
- 51nod 1421:最大MOD值
1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...
- JZOJ-2019-11-7 A组
T1 Input 从文件 awesome.in 中读入数据. 第一行 2 个用空格隔开的整数 \(n\), \(P\). 第二行 n 个用空格隔开的整数 \(A_1, \cdots , A_n\). ...
- webview HttpClient 怎么保持会话session统一
cookies session均为key---value的形式展示, 1. session是存储在服务端,并有一块区域控件存储用户信息,主要是为了判断该用户是否登录,在客户端采用httpC ...
- C++ STD Gems01
本文是根据油管大神的C++标准库课程的一个学习笔记,该课程主要介绍c++标准库中一些非常有用并且代码经常用到的工具. copy .copy_backward .copy_n .copy_if.swap ...
- Codeforces Round #599 (Div. 2) Tile Painting
题意:就是给你一个n,然后如果 n mod | i - j | == 0 并且 | i - j |>1 的话,那么i 和 j 就是同一种颜色,问你最大有多少种颜色? 思路: 比赛的时候,看到 ...
- 池ThreadPoolExecutor使用简介
public static void main(String[] args) { //guava 创建线程池 //https://blog.csdn.net/chinabestchina/articl ...
- python刷LeetCode:2.两数相加
难度等级:中等 题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返 ...
- JavaWeb之Servlet入门(二)
1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...
- Centos配置NAT模式下的静态ip
一.查看所在的ip段 点击 编辑-->虚拟网卡编辑器 选中vmware8网卡,点击 DHCP设置 二.编辑网卡配置文件 查看网卡 ip addr 命令打开配置文件 vi /etc/sysconf ...