Aho-Corasick自动机

 算法:

<功能>

AC自动机用于解决文本一个而模板有多个的问题。

AC自动机可以成功将多模板匹配,匹配意味着算法可以找到每一个模板在文本中出现的位置。

<解释>

KMP中对模板构造失配边,多模板每条模板独立构造失配边太过麻烦。

算法利用Trie+KMP中的失配边。insert(模板) 构造Trie+ getFail添加失配边->AC自动机的状态转移图。

匹配文本串text时只需要调用find,find依次匹配text中的每一个字符失败则沿着失配边走,在匹配路径上如果遇到单词结点(val != 0 )即相当于匹配成功。

但需要注意到:可能有作为当前后缀的单词已经成功匹配,所以需要加入后缀链接last[] 在每一个结点都要处理这种情况。last递推得到。

作者所给模板如下

  1. struct AhoCorasickAutomata {
  2. int ch[MAXNODE][SIGMA_SIZE];
  3. int f[MAXNODE]; // fail函数
  4. int val[MAXNODE]; // 每个字符串的结尾结点都有一个非0的val
  5. int last[MAXNODE]; // 输出链表的下一个结点
  6. int cnt[MAXS];
  7. int sz;
  8.  
  9. void init() {
  10. sz = ;
  11. memset(ch[], , sizeof(ch[]));
  12. memset(cnt, , sizeof(cnt));
  13. ms.clear();
  14. }
  15.  
  16. // 字符c的编号
  17. int idx(char c) {
  18. return c-'a';
  19. }
  20.  
  21. // 插入字符串 v必须非0
  22. void insert(char *s, int v) {
  23. int u = , n = strlen(s);
  24. for(int i = ; i < n; i++) {
  25. int c = idx(s[i]);
  26. if(!ch[u][c]) {
  27. memset(ch[sz], , sizeof(ch[sz]));
  28. val[sz] = ;
  29. ch[u][c] = sz++;
  30. }
  31. u = ch[u][c];
  32. }
  33. val[u] = v;
  34. ms[string(s)] = v;
  35. }
  36.  
  37. // 递归打印以结点j结尾的所有字符串
  38. void print(int j) {
  39. if(j) {
  40. cnt[val[j]]++;
  41. print(last[j]);
  42. }
  43. }
  44.  
  45. // 在T中找模板
  46. int find(char* T) {
  47. int n = strlen(T);
  48. int j = ; // 当前结点编号 初始为根结点
  49. for(int i = ; i < n; i++) { // 文本串当前指针
  50. int c = idx(T[i]);
  51. while(j && !ch[j][c]) j = f[j]; // 顺着细边走 直到可以匹配
  52. j = ch[j][c];
  53. if(val[j]) print(j);
  54. else if(last[j]) print(last[j]); // 找到了
  55. }
  56. }
  57.  
  58. // 计算fail函数
  59. void getFail() {
  60. queue<int> q;
  61. f[] = ;
  62. // 初始化队列
  63. for(int c = ; c < SIGMA_SIZE; c++) {
  64. int u = ch[][c];
  65. if(u) { f[u] = ; q.push(u); last[u] = ; }
  66. }
  67. // 按BFS顺序计算fail
  68. while(!q.empty()) {
  69. int r = q.front(); q.pop();
  70. for(int c = ; c < SIGMA_SIZE; c++) {
  71. int u = ch[r][c];
  72. if(!u) continue;
  73. q.push(u);
  74. int v = f[r];
  75. while(v && !ch[v][c]) v = f[v];
  76. f[u] = ch[v][c];
  77. last[u] = val[f[u]] ? f[u] : last[f[u]];
  78. }
  79. }
  80. }
  81.  
  82. };

【暑假】[实用数据结构] AC自动机的更多相关文章

  1. 数据结构--AC自动机--hdu 2896

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. 从0开始 数据结构 AC自动机 模板(from kkke)

    AC自动机模板 2.4.1 头文件&宏&全局变量 #include <queue> #define MAXN 666666 #define MAXK 26//字符数量 st ...

  3. 从0开始 数据结构 AC自动机 hdu 2222

    参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...

  4. 数据结构14——AC自动机

    一.相关介绍 知识要求 字典树Trie KMP算法 AC自动机 多模式串的字符匹配算法(KMP是单模式串的字符匹配算法) 单模式串问题&多模式串问题 单模就是给你一个模式串,问你这个模式串是否 ...

  5. 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns

    UVAlive 4670 Dominating Patterns 题目:   Dominating Patterns   Time Limit: 3000MS   Memory Limit: Unkn ...

  6. 暑假集训 || AC自动机

    HDU 2222 题意:给n个模式串和一个字符串,求有多少个模式串在这个字符串中出现 思路:裸题,注意数组开的大小 #include <iostream> #include <cst ...

  7. AC自动机(转)

    http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 首先简要介绍一下AC自动机:Aho-Corasick automation,该算 ...

  8. 从Trie谈到AC自动机

    ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字 ...

  9. AC自动机算法详解

    首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章, ...

随机推荐

  1. 在SpringMVC利用MockMvc进行单元测试

    spring在线文档:https://docs.spring.io/spring/docs/current/javadoc-api/index.html?index-files/index-13.ht ...

  2. firefly 框架 结构图

    原地址:http://www.9miao.com/question-15-54838.html 系统结构:

  3. 1987-A. 集训队选拔

    描述 南邮ACM暑期集训队一年一度的选拔如火如荼的开始了.按照以往的惯例,通过ACM校赛预赛和决赛的两轮选拔,成绩优异者将入选集训队,获得下半年在各大赛区现场赛上与各路神牛角逐奖牌的机会.但是,校赛的 ...

  4. 李洪强漫谈iOS开发[C语言-011] - C语言标示符

    /** *    标示符 2016年 7月 14日 01 低级语言和高级语言的最大不同: 低级语言用的是机器指令 高级语言就是写一些人可以看得懂的代码-汇编语言 标示符 就是名字 命名规则: 1) 只 ...

  5. live555源码研究(五)------DynamicRTSPServer类

    一.类DynamicRTSPServer作用 1,提供RTSP服务 二.类DynamicRTSPServer继承关系图

  6. Mysql一主多从和读写分离配置简记

    近期开发的系统中使用MySQL作为数据库,由于数据涉及到Money,所以不得不慎重.同时,用户对最大访问量也提出了要求.为了避免Mysql成为性能瓶颈并具备很好的容错能力,特此实现主从热备和读写分离. ...

  7. Cinema 4D R16安装教程

    CINEMA 4D_百度百科 http://baike.baidu.com/view/49453.htm?fr=aladdin 转自百度贴吧 [教程]Cinema 4D R16新功能介绍及安装教程_c ...

  8. Razor视图引擎的基本概念与法语

    Razor 视图引擎的特点: 简洁.富于表现.流畅 尽量减少页面代码的输入,实现快速流畅的编程工作 不必明确为服务器代码标记起始与结束符,Razor 能智能判断,这样让页面看清洁,代码方便阅读 asp ...

  9. Linux上程序执行的入口--Main

    main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么 ...

  10. Shipping Transactions > Error: The action can not be performed because the selected records could not be locked.

    Shipping Transactions > Action: Launch Pick Release (B: Go) Error: The action can not be performe ...