hdu 2222 ac自动机
对于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自动机相关推荐
- HDU 2222 AC自动机
AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...
- hdu 2222 AC 自动机 模版(数组实现)
AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...
- HDU 2222(AC自动机模板)
AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...
- HDU 2222 ac自动机模板
题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- HDU 6208 AC自动机
题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...
- hdu 3962(AC自动机+矩阵优化dp)
转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...
- HDU 6096 AC自动机
题解: 主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...
- HDU 6208 AC自动机 或 暴力?
简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...
最新文章
- c语言中手机系统,一种手机课堂C语言编程系统的制作方法
- 在Linux系统centos上安装RAR
- 【UEditor】百度编辑器插入video视频
- 牛客多校3 - Two Matchings(dp)
- Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
- 财税、管理知识,离您那么远吗?
- figma 安装插件_彩色滤光片Figma插件,用于色盲
- 如何将java程序打包成exe文件?
- 我们教授编程的方式统统不对!
- 自学python能干什么-普通人学Python能干什么?老男孩Python入门
- Python 操作 DB2 库_亲测可用
- Lua AES加解密
- 海康4200门禁导入人脸_新品上手丨海康威视人脸门禁考勤一体机使用体验
- 白盒测试-条件组合覆盖
- 【腾讯笔试题】记腾讯2019年暑假实习移动端开发在线笔试题
- CAJ(caj)阅读器下载
- 不属于微型计算机的技术特标,计算机组成原理汇总
- 闲鱼前端组件库的建设
- sqlserver 附加数据库方法
- 手机上面正常显示网页大小