模板—AC自动机
时间:2019-11-14
本文章向大家介绍模板—AC自动机,主要包括模板—AC自动机使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
复习了一下板子。
指针实现占内存比较大,要是卡内存就恶心了……
指针实现:
struct AC
{
struct trie
{
trie *nxt[94],*fail;
short inc,ct;
trie(){for(int i=0;i<94;i++)nxt[i]=NULL;fail=NULL;inc=0;ct=0;}
}*root=new trie();
queue<trie*>q;vector<short>al;
void insert(char *s,int id)
{
trie *p=root;int n=strlen(s);
for(int i=0;i<n;i++)
{
if(p->nxt[s[i]-' ']==NULL)p->nxt[s[i]-' ']=new trie();
p=p->nxt[s[i]-' '];
}p->inc=id;
}
void build()
{
q.push(root);
while(!q.empty())
{
trie *p=q.front();q.pop();
for(int i=0;i<94;i++)
if(p->nxt[i])
p->nxt[i]->fail=(p==root?p:p->fail->nxt[i]),q.push(p->nxt[i]);
else p->nxt[i]=(p==root?p:p->fail->nxt[i]);
}
}
void ask(char *s,int tim)
{
al.clear();int n=strlen(s);trie *p=root;
for(int i=0;i<n;i++)
{
p=p->nxt[s[i]-' '];
trie *tmp=p;
while(tmp!=root&&tmp->ct!=tim)
{
if(tmp->inc)al.push_back(tmp->inc);
tmp->ct=tim;tmp=tmp->fail;
}
}
}
}T;
数组实现:
struct AC
{
int nxt[100000][130],fail[100000],inc[100000],ct[100000];
int cnt=1,root=1;
queue<int>q;vector<short>al;
void insert(char *s,int id)
{
int p=root;int n=strlen(s);
for(int i=0;i<n;i++)
{
if(nxt[p][s[i]-' ']==0)nxt[p][s[i]-' ']=++cnt;
p=nxt[p][s[i]-' '];
}inc[p]=id;
}
void build()
{
q.push(root);
while(!q.empty())
{
int p=q.front();q.pop();
for(int i=0;i<94;i++)
if(nxt[p][i])
fail[nxt[p][i]]=(p==root?p:nxt[fail[p]][i]),q.push(nxt[p][i]);
else nxt[p][i]=(p==root?p:nxt[fail[p]][i]);
}
}
void ask(char *s,int tim)
{
al.clear();int n=strlen(s);int p=root;
for(int i=0;i<n;i++)
{
p=nxt[p][s[i]-' '];
int tmp=p;
while(tmp!=root&&ct[tmp]!=tim)
{
if(inc[tmp])al.push_back(inc[tmp]);
ct[tmp]=tim;tmp=fail[tmp];
}
}
}
}T;
原文地址:https://www.cnblogs.com/Al-Ca/p/11856120.html
- 干货 | 前端常用的通信技术
- TP-LINK WR941N路由器研究
- ORA-01113问题的简单分析(r6笔记第3天)
- Tensorflow 中 learning rate decay 的奇技淫巧
- hive数据:名词解释
- 巧妙使用exchange partition的一个案例(r6笔记第1天)
- r与rjava
- 使用expect运行动态脚本(r6笔记第19天)
- 数据库日志中一条"异常"信息所包含的细节(r6笔记第18天)
- linux下编辑VI窗口插入与编辑命令
- rman中三个不完全恢复场景(r6笔记第16天)
- 关于delete,drop,truncate的问题 (r6笔记第14天)
- R语言进行分析,比较详细的一篇,亲测过哦
- DeepMind 开源基于 MuJoCo 物理引擎强化学习工具 Control Suite
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 vagrant 从搭建 gitlab server 开始体验整个 gitlab CI/CD 过程
- 纲手推荐程序笔记1-p5.js创意游戏编程
- 由浅入深彻底了解 Python 闭包和装饰器
- leetcode1078 Occurrences After Bigram
- 负二进制加法实现
- 如何在O(1)时间复杂度下实现LRU
- 字符串拼接的N种方式
- MySQL 解决查询NULL的问题
- 矩阵旋转的解决
- Python partial最通俗的理解
- Django Form的使用
- Python每日一题:装饰器(完整篇)
- Vue视图渲染原理解析,从构建VNode到生成真实节点树
- Vue你不得不知道的异步更新机制和nextTick原理
- 手摸手带你理解Vue的Watch原理