$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. 44 道 JavaScript 难题

    JavaScript Puzzlers原文 1. ["1", "2", "3"].map(parseInt)   答案:[1, NaN, N ...

  2. 线程属性pthread_attr_t简介

    本文编辑整理自: http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html http://www.ibm.com/deve ...

  3. mysql 触发器 trigger用法 two (稍微复杂的)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  4. 解决Linux下jdk版本与安装版本不一致

    解决Linux下jdk版本与安装版本不一致 在Linux下安装jdk后,利用java -version查看版本使,发现不是自己所安装的jdk版本; 解决方案: which java ——查看默认的jd ...

  5. c++中类似于java jprofiler/eclispe memoryanalysis的性能以及内存分析工具

    visual studio有自带的,可以看MSDN,不过一般来说,我们比较关注linux下的,搜了下,比较好用的应该有gprof和valgrind,先记录,可参考如下: http://blog.csd ...

  6. C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder

    part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...

  7. laravel 对接支付宝

    使用的库 omnipay-alipay 申请支付宝支付 这个就不说了, 不明白如何下手的伙伴让运营去和支付宝客服联系吧 composer 安装git库 将以下代码添加到 composer.json { ...

  8. [LeetCode] 701. Insert into a Binary Search Tree

    Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert t ...

  9. Python3基础 str """ 多行字符串

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. 2017年人工智能相关会议论文阅读笔记 (已添加ISSCC17,慢慢补充中)

    ISSCC 2017 Session14 Deep Learning Processors: 关于Deep Learning Processors的Slides笔记,主要参考了[1]中的笔记,自己根据 ...