AC自动机 多字符串匹配 code
来源:互联网 发布:钱夫人 淘宝 编辑:程序博客网 时间:2024/05/16 16:56
AC自动机 有多个匹配串适用
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue> using namespace std; #define NUM (26) struct trienode { trienode *fail; // 失败指针 trienode *next[NUM]; // Trie每个节点含26个孩子 int count; // 以该节点作为结尾的单词数量 trienode() { // 构造函数 fail=NULL; count=0; memset(next, 0, sizeof(next)); } }; void TrieInsert(trienode *root , const char *str){char ch; trienode *p = root; while((ch = *str++)){ int index = ch - 'a'; if(p->next[index] == NULL) p->next[index]= new trienode(); p = p->next[index]; } p->count++; return;}void TrieCreate(trienode **root){*root = new trienode();return;}void TrieDestroy(trienode *root){trienode *p = root;if (!p)return;for (int i = 0; i < NUM; i++) {if (p->next[i])TrieDestroy(p->next[i]); }delete p;return;}void BuildAc(trienode *root){queue<trienode *> qu; root->fail=NULL; qu.push(root); while(!qu.empty()) {trienode *p=NULL; trienode *temp = qu.front();qu.pop(); for(int i = 0; i < NUM; i++) { if(temp->next[i] != NULL) { if(temp == root) temp->next[i]->fail = root; else { p = temp->fail;while(p && p->next[i] == NULL)p = p->fail;temp->next[i]->fail = p ? p->next[i] : root; } qu.push(temp->next[i]); } } }return;} // Ac自动机多模式串匹配, 返回匹配的个数int AcStrSearch(const char *str, trienode *root){char ch;int cnt = 0; trienode *p = root;if (!str)return -1; while ((ch = *str++)) { int index = ch - 'a';trienode *temp; while (p->next[index] == NULL && p != root)p = p->fail; p = p->next[index]; p = p ? p : root; temp = p; while(temp != root && temp->count != -1) { cnt += temp->count; temp->count = -1; temp = temp->fail; } } return cnt; } char pat[256]; // 输入的匹配串char txt[100000]; // 输入的正文主串int main(){ int n1, n2; scanf("%d",&n1); while(n1--){char *str;trienode *root;TrieCreate(&root); scanf("%d",&n2); while(n2--){ scanf("%s", pat); TrieInsert(root, pat); } BuildAc(root); scanf("%s", txt);str = txt; printf("%d\n", AcStrSearch(str, root));TrieDestroy(root); } return 0; }
0 0
- AC自动机 多字符串匹配 code
- 多串匹配-AC自动机
- 多串匹配 AC自动机
- HDU 2896 AC自动机 模式串匹配
- HDU2222 多串匹配 (AC自动机)
- AC自动机 多模式串匹配 模板
- 字符串匹配-AC自动机
- AC自动机通配符匹配
- AC自动机通配符匹配
- AC自动机匹配
- 【AC自动机】地图匹配
- AC自动机(多模串匹配)
- 【AC自动机+DP】匹配(match)
- 字符串匹配之AC自动机
- 数据结构-字符串匹配AC自动机
- HDU2896 AC自动机多串匹配多串
- hdu 3065 AC自动机 匹配串编号以及出现次数
- AC自动机——多模式串的匹配
- 错误解决方式汇总
- 创建显示对话框的DL
- 跨域写cookie
- 深圳太极软件笔试题回顾(2013年12月11日)
- fatfs写SD卡卡死
- AC自动机 多字符串匹配 code
- Working Practice-快速原型模型
- php session学习笔记
- 我的“mtp 该设备无法启动 代码 10”的不法之法..
- Java继承和多态
- mac Sublime Text 2 破解
- android BitmapFactory.Options 优化bitmap图像
- 菜单使用
- Linux中用C语言写系统日志