AC自动机模板(多模式匹配)
来源:互联网 发布:淘宝买家v3会员是几钻 编辑:程序博客网 时间:2024/05/21 19:31
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;//ac_automaton algorithmconst int MAXNODE = 550000;const int SIGMA_SIZE = 26;int fail[MAXNODE]; //失配数组int last[MAXNODE]; //后缀链接int ans;//构造trieint ch[MAXNODE][SIGMA_SIZE]; //将单词存储在ch中int val[MAXNODE]; //每个单词出现的个数int sz; //节点编号void init(){ ans = 0; sz = 1; memset(ch[0], 0, sizeof(ch[0]));}void insert(char *s){ int u = 0; int len = strlen(s); for(int i = 0; i < len; ++i) { int c = s[i] - 'a'; if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u]++;}//计算last后缀链接void getFail(){ queue<int> q; fail[0] = 0; for(int c = 0; c < SIGMA_SIZE; c++) { int u = ch[0][c]; if(u) { fail[u] = 0; q.push(u); last[u] = 0; } } while(!q.empty()) { int r = q.front(); q.pop(); for(int c = 0;c < 26;c++) { int u = ch[r][c]; if(!u){ ch[r][c] = ch[fail[r]][c]; continue;} q.push(u); int v = fail[r]; while(v && !ch[v][c]) v = fail[v]; fail[u] = ch[v][c]; last[u] = val[fail[u]] ? fail[u] : last[fail[u]]; } //cout << last[r] <<endl; }}void solve(int j){ //cout << j <<endl; if(!j) return; if(val[j]) { ans += val[j]; val[j] = 0; } solve(last[j]);}void find(char* T){ int len = strlen(T),j = 0; getFail(); for(int i = 0; i < len; i++) { j = ch[j][T[i] - 'a']; //cout << val[j] <<endl; if(val[j]) solve(j); else if(last[j]) solve(last[j]); }}
阅读全文
1 0
- AC自动机 多模式串匹配 模板
- AC自动机模板(多模式匹配)
- AC自动机模板及对多模式匹配的理解
- 多模式匹配--AC自动机算法
- AC自动机(多模式匹配)
- ac自动机实现多模式匹配
- AC自动机-多模式匹配算法
- 关键词匹配(Ac自动机模板题)
- 数据结构-字符串匹配AC自动机模板
- 多模式匹配算法:AC自动机的C++实现
- AC自动机——多模式串的匹配
- Aho-Corasick 多模式匹配算法、AC自动机详解
- HDU 2896 病毒入侵 AC自动机 多模式串匹配
- Aho-Corasick 多模式匹配算法、AC自动机详解
- 多串匹配-AC自动机
- 多串匹配 AC自动机
- HDU 2896 AC自动机 模式串匹配
- 【AC自动机】AC自动机模板
- 线程同步与互斥:互斥锁
- php 保留小数点后两位
- 2017-11-14 知识总结
- Plugin with id 'com.novoda.bintray-release' not found的解决方法
- 贝叶斯分类器解读
- AC自动机模板(多模式匹配)
- 原来这样做,才能向架构师靠近
- 【Java】Java中如何获取Element中的value值?
- mysql查看创建数据表的DDL语句
- jmeter 带range请求
- 【Java】Java的序列化与反序列化
- eclipse 导入报错:JRE System Library[Unbound]
- android 通话记录显示名称不对
- mysql 事物隔离级别解读