从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 ...
随机推荐
- 设计模式——抽象工厂模式
Abstract Factory模式,即抽象工厂模式,该模式要求Factory类为抽象的,并且里面的生产出来的产品也是抽象的! 这里需要着重说的一点就是,抽象类和抽象方法的作用--规范了子类的实现,以 ...
- 转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
最近随着网站访问量的提高把web服务器移到linux下了,在移服务器的第二天,tomcat频繁的报 java.net.SocketException: Too many open files错误,错误 ...
- 解决线上Tomcat启动慢
vim /application/jdk/jre/lib/security/java.security # securerandom.source=file:/dev/randomsecurerand ...
- Java中的哈夫曼树
package com.ietree.basic.datastructure.tree; import java.util.ArrayDeque; import java.util.ArrayList ...
- 接管radiobutton onclick 事件
You can nil the OnClick event handler while changing a radiobutton state programmatically: procedure ...
- Cout<<XXX<<<XXX<<<XXX,是从左到右计算的
int a=1,b=2,c=3; cout<<(c=a+b)<<' '<<(a=b+c)<<' '<<(b=a+c)<<e ...
- css3有哪些新特性
转载:http://blog.csdn.net/lxcao/article/details/52797914
- vue-cli脚手架build目录中的webpack.base.conf.js配置文件
转载自:http://www.cnblogs.com/ye-hcj/p/7082620.html webpack.base.conf.js配置文件// 引入nodejs路径模块 var path = ...
- Windows资源监控神器——perfmon
一.简述 笔者在用lr中control监控Windows资源的时候,有时候总是遇到卡死和报错,所以就发现了Windows自带的监控神器————perfmon. Perfmon提供了图表化的系统性能实时 ...
- sgu 100 A+B 解题报告及测试数据
100.A+B time limit per test: 0.25 sec. memory limit per test: 65536 KB 题解:上手题,不解释. 直接上代码: #include & ...