AC自动机模板

2.4.1 头文件&宏&全局变量

#include <queue>

#define MAXN 666666
#define MAXK 26//字符数量 struct Node{
Node *son[MAXK];
Node *fail;
int num;//以此节点为末尾的模式串数量
bool flag;//去重用,可选
}node[MAXN],*root,*top;
queue<Node*>q;//建立自动机时使用

2.4.2 辅助函数

int mapToK(char c)//把字符隐射到0~MAXK-1
{
return c-'a';
} Node *newNode()
{
memset(top->son,0,sizeof(top->son));
top->num=0;
return top++;
} void initNode()//初始化节点分配
{
top=node;
root=newNode();
}

2.4.3 主要函数

void addPattern(char *s)//添加模式串
{
Node *nown=root;
while(*s)
{
int k=mapToK(*s);
if(!nown->son[k])nown->son[k]=newNode();
nown=nown->son[k];
s++;
}
nown->num++;
} void buildACAutoMaton()//计算fail
{
root->fail=nullptr;
q.push(root);
while(!q.empty())
{
Node *nown=q.front();q.pop();
for(int i=0;i<MAXK;i++)
{
if(nown->son[i])
{
Node *p=nown->fail;
while(p&&!p->son[i])p=p->fail;
nown->son[i]->fail=p?p->son[i]:root;
q.push(nown->son[i]);
}
}
}
}

2.4.4 可选参考函数

void initFlag()//初始化去重标记
{
root->flag=false;
for(Node *i=root+1;i<top;i++)
i->flag=true;
} int match(char *s)//返回匹配次数
{
initFlag();
Node *nown=root;
int ans=0;
while(*s)
{
int k=mapToK(*s);
while(nown&&!nown->son[k])nown=nown->fail;
nown=nown?nown->son[k]:root;
for(Node *i=nown;i->flag;i=i->fail)
{
ans+=i->num;
i->flag=false;
}
s++;
}
return ans;
}```
#### 2.4.5 用法

//先initNode();初始化

//然后addPattern添加模式串

//最后buildACAutoMaton

从0开始 数据结构 AC自动机 模板(from kkke)的更多相关文章

  1. 从0开始 数据结构 AC自动机 hdu 2222

    参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...

  2. Match:Keywords Search(AC自动机模板)(HDU 2222)

    多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...

  3. 数据结构--AC自动机--hdu 2896

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. HDU 3065 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...

  5. HDU 2896 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...

  6. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

  7. HDU 2222 (AC自动机模板题)

    题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...

  8. hdu 2222 Keywords Search ac自动机模板

    题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...

  9. KMP与AC自动机模板

    HDU 1711 Number Sequence(KMP模板题) http://acm.hdu.edu.cn/showproblem.php?pid=1711 #include<bits/std ...

随机推荐

  1. 设计模式之Singleton模式

    当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了Singleton模式,即单例模式. 单例模式的特征: 想确保任何情况下只存在一个实例 想在程序上表现出只存在一个实例 示例 ...

  2. rabbitmq延迟队列相关

    https://blog.csdn.net/qq_26656329/article/details/77891793        --------------rabbitmq queue_decla ...

  3. 转:Java多线程学习(吐血超详细总结)

    版权声明:本文为博主林炳文Evankaka原创文章,转载请注明出处http://blog.csdn.net/evankaka 目录(?)[+] 林炳文Evankaka原创作品.转载请注明出处http: ...

  4. 全球数字货币交易所TOP20安全性评级报告

      链塔智库2018-05-03 10:28 分析师:常昊.王婧雯    来源: 链塔智库 全球加密数字货币市值超2.5万亿元,单日交易额超2000亿元,全球超过3000万人已投入加密数字货币领域. ...

  5. lua获取table的长度

    lua在获取table的size时,不能一味的使用类似于java里面的length函数 table的存储是类似hashTable的kv形式. -- table.getn(tableName) 得到一个 ...

  6. 浅析Linux中的进程调度

    2016-11-22 前面在看软中断的时候,牵扯到不少进程调度的知识,这方面自己确实一直不怎么了解,就趁这个机会好好学习下. 现代的操作系统都是多任务的操作系统,尽管随着科技的发展,硬件的处理器核心越 ...

  7. Flask蓝图,Session,闪现,中间件等

    Session 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设 ...

  8. 图解HTTP之HTTPS详解

    背景:随着越来越多的主流网站已经使用了HTTPS,作为服务器端开发者,就必须了解HTTPS的优势与劣势. 在HTTP协议中有可能存在信息窃听或身份伪装等问题,而使用HTTPS通信机制可以有效地防止这些 ...

  9. PAT 1120 Friend Numbers[简单]

    1120 Friend Numbers (20 分) Two integers are called "friend numbers" if they share the same ...

  10. css图片上悬浮文字(丝带效果)实现

    首先看效果 思路:1.去掉“丝带“菱角使用的是overflow: hidden; 2.通过z-index降低图片的优先级或者调高“丝带”优先级来实现覆盖效果(z-index需要写在有position的 ...