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. python3在centos6.6上的安装

    建议:在看这个文档操作前,最好先参考一下这个:https://www.cnblogs.com/bookwed/p/10251236.html,是解决pip安装模块时,提示ssl版本低的问题. #提前的 ...

  2. 剑指Offer——二叉树的深度

    题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 分析: 二叉树的深度等于其左子树的深度和右子树的深度两个中最大的深 ...

  3. NoSQL文章

    MongoDB Bugsnag的MongoDB分片集群使用经验

  4. Spring-BeanFactory容器

    Spring的BeanFactory容器 这是Spring中最简单地容器,它主要的功能是为依赖注入(DI)提供支持.这个容器接口在org.springframework.beans.factory.B ...

  5. (0.2)linux下Mysql的安装配置与管理入门(目录篇)

    本章学习内容: 1.基于Linux平台的Mysql项目场景介绍 1.1.互联网各类网站.购物网站.门户网站.博客系统.IDC,云平台,VPS,虚拟主机空间,论坛,嵌入式. 2.mysql数据库运行环境 ...

  6. python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明

    一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...

  7. 六、Mosquitto 高级应用之SSL/TLS

    mosquitto提供SSL支持加密的网络连接和身份验证.本章节讲述次功能的实现. 在此之前需要一些准备工作. 准本工作: 一台 Linux 服务器. 安装好 openssl (不会明白怎么安装 op ...

  8. PAT 1108 Finding Average [难]

    1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...

  9. (转)MFC中Doc,View,MainFrmae,App各指针的互相获取

    App是应用域,所有的域中的东西都可以通过全局函数访问到它. MainFrame是主框架,也基本可以用全局函数访问到. MainFrame下是若干个ChildFrame,ChildFrame中若干个V ...

  10. 安装memcached扩展

    1.wget http://pecl.php.net/package/memcache  下载相对应的扩展包 2. tar -zxvf memcache-2.2.7.tgz 3.  cd memcac ...