对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的。

要了解ac自动机就要先知道trie树,还有了解一点KMP算法。

trie树的话 就是一个字典树,把单词在树上排好,KMP的话 主要懂他的失败指针。

ac自动机是处理字符串匹配的,查询匹配字符串是否在主串中出现和如出现,则出现的位置。

看代码注释



#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;const int kind=26;
struct node{node *fail;node *next[kind];   //所有26个字母int count;    // 1代表是单词的结尾,0代表不是node(){fail=NULL; count=0; memset(next,NULL,sizeof(next));}
}*q[500001];
char keyword[55];    //匹配串
char str[1000004]; //主串
int head,tail;void insert(node *root,char *str)   //建立一个字典树
{node *p=root;int i=0,index;while(str[i]){index=str[i]-'a';if(p->next[index]==NULL) p->next[index]=new node();   //如果尚未出现在字典序中就创造一个p=p->next[index];i++;}p->count++;  //令单词的最后一个标志为1
}void build_ac_automation(node *root){    //匹配失败指针int i;root->fail=NULL;q[head++]=root;while(head!=tail){node *temp=q[tail++];node *p=NULL;for(i=0;i<26;i++){if(temp->next[i]!=NULL){if(temp==root) temp->next[i]->fail=root;else{p=temp->fail;while(p!=NULL){        //不断寻找父节点的失败指针,直到父节点的失败指针指向节点的儿子节点与自己相同if(p->next[i]!=NULL){temp->next[i]->fail=p->next[i];break;}p=p->fail;}if(p==NULL) temp->next[i]->fail=root;}q[head++]=temp->next[i];}}}
}int query(node *root){            //统计匹配串出现的次数。int i=0,cnt=0,index,len=strlen(str);node *p=root;while(str[i]){index=str[i]-'a';while(p->next[index]==NULL&&p!=root) p=p->fail;p=p->next[index];p=(p==NULL)?root:p;node *temp=p;while(temp!=root&&temp->count!=-1){    //避免重复计算cnt+=temp->count; temp->count=-1;temp=temp->fail;}i++;}return cnt;
}
int main()
{int t;scanf("%d",&t);while(t--){int n;head=tail=0;node *root=new node();scanf("%d",&n);getchar();while(n--){scanf("%s",keyword);insert(root,keyword);}build_ac_automation(root);scanf("%s",str);printf("%d\n",query(root));}return 0;
}

hdu 2222 ac自动机相关推荐

  1. HDU 2222 AC自动机

    AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...

  2. hdu 2222 AC 自动机 模版(数组实现)

    AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...

  3. HDU 2222(AC自动机模板)

    AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...

  4. HDU 2222 ac自动机模板

    题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...

  5. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  6. HDU 6208 AC自动机

    题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...

  7. hdu 3962(AC自动机+矩阵优化dp)

    转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...

  8. HDU 6096 AC自动机

    题解:  主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...

  9. HDU 6208 AC自动机 或 暴力?

    简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...

最新文章

  1. c语言中手机系统,一种手机课堂C语言编程系统的制作方法
  2. 在Linux系统centos上安装RAR
  3. 【UEditor】百度编辑器插入video视频
  4. 牛客多校3 - Two Matchings(dp)
  5. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
  6. 财税、管理知识,离您那么远吗?
  7. figma 安装插件_彩色滤光片Figma插件,用于色盲
  8. 如何将java程序打包成exe文件?
  9. 我们教授编程的方式统统不对!
  10. 自学python能干什么-普通人学Python能干什么?老男孩Python入门
  11. Python 操作 DB2 库_亲测可用
  12. Lua AES加解密
  13. 海康4200门禁导入人脸_新品上手丨海康威视人脸门禁考勤一体机使用体验
  14. 白盒测试-条件组合覆盖
  15. 【腾讯笔试题】记腾讯2019年暑假实习移动端开发在线笔试题
  16. CAJ(caj)阅读器下载
  17. 不属于微型计算机的技术特标,计算机组成原理汇总
  18. 闲鱼前端组件库的建设
  19. sqlserver 附加数据库方法
  20. 手机上面正常显示网页大小

热门文章

  1. 围观一下tp的游戏保护 一
  2. RabbitMQ负载均衡(1)
  3. 我在攻读计算机视觉和机器学习硕士学位时学到了什么
  4. Netflix在安卓移动启用AV1格式 较VP9编码效率提升20%
  5. 第二章 Spark RDD以及编程接口
  6. 剑指offer之题解目录(全)
  7. nginx模块开发—HTTP初始化之listen
  8. vim编辑器---批量注释与反注释
  9. 一窥谷歌神经机器翻译模型真面貌 其底层框架开源
  10. 有初学的同学问你为什么Java的main方法必须是public static void?请告诉ta!