从0开始 数据结构 AC自动机 模板(from kkke)
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)的更多相关文章
- 从0开始 数据结构 AC自动机 hdu 2222
参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...
- Match:Keywords Search(AC自动机模板)(HDU 2222)
多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...
- 数据结构--AC自动机--hdu 2896
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 3065 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...
- HDU 2896 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...
- HDU 2222(AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...
- HDU 2222 (AC自动机模板题)
题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...
- hdu 2222 Keywords Search ac自动机模板
题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...
- KMP与AC自动机模板
HDU 1711 Number Sequence(KMP模板题) http://acm.hdu.edu.cn/showproblem.php?pid=1711 #include<bits/std ...
随机推荐
- python 通过文件路径获取文件hash值
import hashlib import os,sys def CalcSha1(filepath): with open(filepath,'rb') as f: sha1obj = hashli ...
- SoftReference、WeakReference、PhantomRefrence分析和比较
级别 什么时候被垃圾回收 用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行时终止 软引用 在内存不足时 优化内存使用 内存不足时终止 弱引用 在垃圾回收时 对象缓存 gc运行后终止 虚 ...
- oracle入门(7)——存储过程
[本文介绍] 熟悉了PL/SQL语法后,实现java调用oracle存储过程才是主要目的.本文将介绍如何写存储过程,java如何调用存储过程. [存储过程介绍] 抛开专业的描述,存储过程就是在数据库里 ...
- Using Bluetooth LE with Go (Golang)
Using Bluetooth LE with Go (Golang) Gatt is a Go package, which provides developers to create BLE a ...
- appium ios 自动化测试
iOS自动化测试:Appium 从入门到实践https://www.jianshu.com/p/43f858180557appium自动化测试iOS Demohttps://www.jianshu.c ...
- 工作笔记——web字体格式转换
转载自:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字体 ...
- zen-cart安装出现时区错误解决办法
有时候在安装zen-cart的时候出现时区错误,提示: ERROR: date.timezone not set in php.ini. Please contact your hosting com ...
- Mvc ModelState.isValid为false时,检查时那个字段不符合规则的代码
List<string> sb = new List<string>(); //获取所有错误的Key List<string> Keys = ModelState. ...
- 自己写个 Drools 文件语法检查工具——栈的应用之编译器检测语法错误
一.背景 当前自己开发的 Android 项目是一个智能推荐系统,用到 drools 规则引擎,于我来说是一个新知识点,以前都没听说过的东东,不过用起来也不算太难,经过一段时间学习,基本掌握.关于 d ...
- ruby中的可调用对象--方法
上一篇讲了ruby中的可调用对象proc和lambda,他们都是块转换成的对象.ruby中的可调用对象还有方法.通过使用method方法,并且以方法名作为参数(字符串或者符号),就可以得到一个方法对象 ...