$build$函数建立$ac$自动机以及$fail$树, $query$求出$ac$自动机中每个串在$s$中出现次数保存在$sz$数组中, 返回所有串出现总次数. 这个板子内存占用略大, 但是支持同时开多台ac自动机, 并且每台$ac$自动机都可以很容易清零.

const int N = 2e6+10;
int tot;
int ch[N][26], ch2[N][26];
int fail[N], val[N], sum[N], sz[N], End[N];
char s[N];
vector<int> g[N];
queue<int> q, Q; struct AC_automaton {
int T;
void newnode(int &o) {
if (Q.size()) {o = Q.front(); Q.pop();}
else o=++tot;
memset(ch[o],0,sizeof ch[o]);
val[o] = sum[o] = sz[o] = 0;
}
void add(int &o, char *s, int v, int id) {
if (!o) newnode(o);
if (*s) add(ch[o][*s-'a'],s+1,v,id);
else val[o] += v, End[id] = o;
}
void add(char *s, int v, int id) {
add(T,s,v,id);
}
void build() {
REP(i,0,25) ch2[T][i]=T;
q.push(T), fail[T]=T;
while (q.size()) {
int x = q.front(); q.pop();
sum[x] = sum[fail[x]]+val[x];
REP(i,0,25) {
if (ch[x][i]) {
int y = ch[x][i];
q.push(y);
fail[y] = ch2[fail[x]][i];
ch2[x][i] = y;
g[fail[y]].pb(y);
} else ch2[x][i] = ch2[fail[x]][i];
}
}
}
void dfs(int x) {
for (int y:g[x]) dfs(y),sz[x]+=sz[y];
}
int query(char *s) {
int n = strlen(s), now = T, ans = 0;
REP(i,0,n-1) {
now = ch2[now][s[i]-'a'];
ans += sum[now], ++sz[now];
}
dfs(T);
return ans;
}
void dfs2(int x) {
for (int y:g[x]) dfs2(y);
Q.push(x),g[x].clear();
}
void clear() {
if (T) dfs2(T),T=0;
}
} ac;

AC自动机练习的更多相关文章

  1. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  2. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  3. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  4. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  5. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  6. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  7. [AC自动机]【学习笔记】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...

  8. AC自动机 HDU 3065

    大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...

  9. AC自动机 HDU 2896

    n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...

  10. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

随机推荐

  1. MySQL数据库----视图

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时 ...

  2. 电脑异常断电,IDEA崩溃

    今天电脑突然断电,当时正好开着idea,等了半天无果,只能强行关机重启.重启之后,那么问题来了:重新打开idea报错java.lang.AssertionError:upexpected conten ...

  3. Rest风格(占位符)的映射

  4. 01: MySql简介

    MySQL其他篇 目录: 参考网站 1.1 数据库介绍 1.2 视图 1.3 触发器 1.4 事物 1.1 数据库介绍返回顶部 1.什么是数据库? 1. 数据库(Database)是按照数据结构来组织 ...

  5. Autotools使用流程【转】

    本文转载自:http://blog.csdn.net/scucj/article/details/6079052 手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然 ...

  6. PyCharm/IDEA 使用技巧总结

    基本概念 IDEA 没有类似 Eclipse 的工作空间的概念(workspace),最大单元就是 Project.这里可以把 Project 理解为 Eclipse 中的 workspace.Mod ...

  7. bzoj1055 ||P4290 [HAOI2008]玩具取名

    目录 链接 思路 代码 链接 luogu bzoj 思路 区间dp 然后\(f[i][j][k]\) 区间\([i,j]\)能否变成\(k\)字符 (字符当然得转化一下) 字符的个数不多,直接暴力\( ...

  8. P4113 [HEOI2012]采花 (莫队TLE)

    思路 update 11.2 树状数组AC 本题莫队过不去,会TLE ----------------------- 但也是个不错的莫队练手题 ------------------------ 毕竟C ...

  9. Jedis和JAVA对象的序列化和反序列化的使用

    1. Jedis版本: jedis-2.6.2.jar 背景:现在系统提供portal接口服务,使用JDBC直接查询数据库,使用jedis提供的缓存功能,在JDBC前面加上Redis,先从Redis中 ...

  10. 网络压缩论文整理(network compression)

    1. Parameter pruning and sharing 1.1 Quantization and Binarization Compressing deep convolutional ne ...