(AC自动机)模板
来源:互联网 发布:洗衣机选购 知乎 编辑:程序博客网 时间:2024/05/22 02:11
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <queue>using namespace std;const int allSon=26;char patten[60]; ///模式串char text[1000010]; ///文本串int ans;struct TrieNode{ struct TrieNode *son[allSon]; struct TrieNode *fail;//失败指针 int num;//是不是一个单词}*root;TrieNode* createNode()//创建Tiree树并且完成对树的初始化{ TrieNode *p; p = (TrieNode*)malloc(sizeof(TrieNode)); memset(p->son,0,sizeof(p->son)); p->num = 0; p->fail = NULL; return p;}///插入模式串,构建字典树void insertPatten(){ TrieNode *p; p = root; int index = 0; while(patten[index]) { int lowercase = patten[index]-'a'; if(p->son[lowercase]==NULL) { p->son[lowercase] = createNode(); } p = p->son[lowercase]; index++; } p->num++;//到了单词的末尾 此时是一个单词则num置一}///求fail指针。构造AC自动机。void build_AC_automaton()//利用bfs构建失败指针 构建失败指针时需要注意对第二层进行处理 就是让第二层全部都指向根节点 让根节点的失败指针置为ULL{ TrieNode *p; p = root; queue<TrieNode*>qu; qu.push(p); while(!qu.empty()) { p = qu.front(); qu.pop(); for(int i = 0; i < allSon; i++) { if(p->son[i] != NULL) ///第i个孩子存在 { if(p == root) ///p是根,根节点的孩子的失败指针都指向自己 { p->son[i]->fail = root; } else { TrieNode *node = p->fail;//如果node不为空 并且在node的儿子里也有字母z让这个失败指针指向失败指针的儿子 while(node != NULL) { if(node->son[i]!=NULL) { p->son[i]->fail = node->son[i]; break; } node = node->fail; } if(node == NULL)//如果到最后都没有找到node里面有字母z则直接让这个失败指针指向其root p->son[i]->fail = root; } qu.push(p->son[i]);//并将其插入队列里面 } } }}void find_in_AC_automaton(){ TrieNode *p; p = root; int index = 0; while(text[index] != '\0') { int lowercase = text[index]-'a'; while(p->son[lowercase]==NULL && p!=root) p = p->fail; p = p->son[lowercase]; if(p == NULL) p = root; TrieNode *temp = p; while(temp!=NULL && temp->num!=-1) { ans += temp->num; temp->num = -1; temp = temp->fail; } index++; }}void freeNode(TrieNode *node){ if(node != NULL) { for(int i = 0; i < allSon; i++) freeNode(node->son[i]); } free(node);}int main(){ int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); root = createNode(); for(int i = 0; i < n; i++) { scanf("%s",patten); insertPatten(); } scanf("%s",text); build_AC_automaton(); ans = 0; find_in_AC_automaton(); printf("%d\n",ans); freeNode(root); } return 0;}
阅读全文
0 0
- AC 自动机(模板)
- (AC自动机)模板
- hdu2896(AC自动机模板)
- AC自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- AC自动机模板(【CJOJ1435】)
- 【AC自动机】AC自动机模板
- ac自动机(dp)<AC自动机模板> ---高精度处理
- 字符串模板总结(一):AC自动机
- AC自动机模板(数组+指针)hdu2222
- AC自动机(模板题)hdu2896
- 数单词 (AC自动机模板题)
- AC自动机模板(数组实现版)
- 病毒侵袭(ac自动机模板)
- HDU-5384Danganronpa(AC自动机模板)
- AC自动机入门+模板 (HDU 2222)
- HDU 2222 (AC自动机模板)
- ELK+kafka日志系统搭建-实战
- Slidingmenu(侧滑)
- 微信 被回复信息
- TensorFlow
- PagerApapter、FragmentPageAdapter、FragmentStatePageAdapter源码解析
- (AC自动机)模板
- shell算数运算
- Mysql LOAD DATA demo
- 最近把beecloud,芝麻信用,智能门锁接入了系统。闲下来把遇到的一些坑排下,也能给后人一些指导
- [设计模式]原型模式
- Socket通信过程
- 【摩客专访】简单易用的背后是吹毛求疵的追求 | 专访“方片收集”作者田飞
- 2. TraitsUI基础
- 1254 Hansel and Grethel