- 浏览: 389221 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
wsyzyrxp:
非常感谢 兄弟 帮了我大忙
[opengl]弹簧质点法模拟柔性布料以及椭球碰撞的opengl实现 -
mingdry0304:
[opengl]彩色立方体旋转 -
tyfengyu:
我刚刚更改的代码加上了标准差stdVal,故recoMat应该 ...
[python]用python实现的pca算法 -
tyfengyu:
python的pca代码有2处错误:1.finalData = ...
[python]用python实现的pca算法 -
暴风雪:
McFlurry 写道前排(凑字数)!擦你怎么摸来这里的
诈尸总结
大致题意:
给出n个模式串(长度不超过50),和一个文本串(长度不超过1000000),求出有多少个模式串在这个文本串中出现过。
大致思路:
标准的AC自动机问题,主要是学习模版,理解自动机的匹配机制。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include <algorithm> using namespace std; const int inf=1<<28; const int nMax=500; const int mMax=500005; class node{ public: int id; int vis; //前缀记录标志 node *next[26],*fail; node(){ vis=0; fail=NULL; for(int i=0;i<26;i++)next[i]=NULL; } }*root,*que[mMax]; void insert(char *s){ //构造前缀树 int i; node *r=root; int l=strlen(s); for(i=0;i<l;i++){ int loc=s[i]-'a'; if(r->next[loc]==NULL){ r->next[loc]=new node(); } r=r->next[loc]; } r->vis++; } void acAuto(){ //用bfs为每个节点设定fail指针 int i,head=0,tail=0; node *p,*tmp; root->fail=NULL; que[tail++]=root; while(head<tail){ tmp=que[head++]; for(i=0;i<26;i++){ if(tmp->next[i]==NULL)continue; if(tmp==root){ tmp->next[i]->fail=root; } else { for(p=tmp->fail;p!=NULL;p=p->fail){ if(p->next[i]!=NULL){ tmp->next[i]->fail=p->next[i]; break; } } if(p==NULL){ tmp->next[i]->fail=root; } } que[tail++]=tmp->next[i]; } } } int search(char *msg){ int i,idx,ans=0; node *p=root,*tmp; for(i=0;msg[i];i++){ idx=msg[i]-'a'; while(p->next[idx]==NULL&&p!=root){ p=p->fail; } p=p->next[idx]; if(p==NULL)p=root; for(tmp=p;tmp!=NULL&&tmp->vis!=-1;tmp=tmp->fail){ ans+=tmp->vis; tmp->vis=-1; } } return ans; } int main(){ int cas,n,i; char str[52],text[1000002]; scanf("%d",&cas); while(cas--){ scanf("%d",&n); root=new node(); while(n--){ scanf("%s",str); insert(str); } acAuto(); scanf("%s",text); printf("%d\n",search(text)); } return 0; }
另附上静态tire树版本,可以省去不少生成新对象的时间(动态250ms,静态180)
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include <algorithm> using namespace std; const int inf=1<<28; const int nMax=500; const int mMax=500005; class node{ public: int id; int vis; //前缀记录标志 node *next[26],*fail; // node(){ // vis=0; // fail=NULL; // for(int i=0;i<26;i++)next[i]=NULL; // } }*root,*que[mMax],num[5000000]; int x; node *newnode(){ node * p = num + x++; for(int i = 0; i <26; i++){ p->next[i] = NULL; } p->fail=NULL; p->vis=0; return p; } void insert(char *s){ //构造前缀树 int i; node *r=root; int l=strlen(s); for(i=0;i<l;i++){ int loc=s[i]-'a'; if(r->next[loc]==NULL){ r->next[loc]=newnode(); } r=r->next[loc]; } r->vis++; } void acAuto(){ //用bfs为每个节点设定fail指针 int i,head=0,tail=0; node *p,*tmp; root->fail=NULL; que[tail++]=root; while(head<tail){ tmp=que[head++]; for(i=0;i<26;i++){ if(tmp->next[i]==NULL)continue; if(tmp==root){ tmp->next[i]->fail=root; } else { for(p=tmp->fail;p!=NULL;p=p->fail){ if(p->next[i]!=NULL){ tmp->next[i]->fail=p->next[i]; break; } } if(p==NULL){ tmp->next[i]->fail=root; } } que[tail++]=tmp->next[i]; } } } int search(char *msg){ int i,idx,ans=0; node *p=root,*tmp; for(i=0;msg[i];i++){ idx=msg[i]-'a'; while(p->next[idx]==NULL&&p!=root){ p=p->fail; } p=p->next[idx]; if(p==NULL)p=root; for(tmp=p;tmp!=NULL&&tmp->vis!=-1;tmp=tmp->fail){ ans+=tmp->vis; tmp->vis=-1; } } return ans; } int main(){ int cas,n,i; char str[52],text[1000002]; scanf("%d",&cas); while(cas--){ x=0; scanf("%d",&n); root=newnode(); while(n--){ scanf("%s",str); insert(str); } acAuto(); scanf("%s",text); printf("%d\n",search(text)); } return 0; }
发表评论
-
[树状数组]poj 2299
2014-12-13 20:58 1912题意 求一列数字的逆序数。 思路 ... -
[树状数组]hdoj 1166
2014-12-12 01:21 2题意 http://acm.hdu.edu.cn/ ... -
[树状数组]hdoj 1166
2014-12-12 01:21 890题意 http://acm.hdu.edu.cn/ ... -
[离散化+线段树]poj2528
2014-12-01 23:16 617题意 给出每个海报的位置,问最后没有被完全覆盖 ... -
[线段树区间合并]poj 3667
2014-12-01 11:45 796i题意 和poj1823差不多,加了一个查 ... -
[线段树区间更新]poj 1823
2014-12-01 02:56 896题意 一个旅馆有n个房间,有m次操作,每次操作可 ... -
[线段树]poj 3368
2014-11-29 07:58 747题意 给出一串数字,有m次询问,每次询问[ab ... -
[线段树成段更新]poj 2777
2014-11-28 01:33 1130题意: 一段区间从1-n的初始颜色为1,每 ... -
[线段树]poj 2182
2014-11-27 23:13 613题意: n头牛站队,每头牛都有一个属于[ ... -
[线段树]poj 3264
2014-11-27 21:57 504题意 给出一串数字,m个询问,对于每次询问求出 ... -
[线段树成段更新]hdoj 1698
2014-11-27 21:00 724题意: 对一个线段上的值进行修改,一次可以把[i, ... -
[线段树成段更新]poj 3468
2014-11-27 12:43 704题意: 给出一串n个数,每次操作分为两种,分 ... -
[线段树]poj 2828
2014-11-26 22:02 726题意 n个人插队,每次某个人都会选择插入第i个 ... -
[线段树]hdoj 2795
2014-11-25 20:33 872题意:一个高h宽w的二维空间,每次放进去一个高为1,宽为a的 ... -
[线段树]hdoj 1394
2014-11-24 22:40 934题意 给出一列n个数字,每一个数字都和其他 ... -
[后缀数组]acdream 1430
2014-10-16 14:08 530大致题意: 求出一个字符串(len<=1 ... -
[KMP+乱搞]hdoj 4749
2014-10-11 15:22 780大致题意: 求文本串中最多能选出多少子串,使得这 ... -
[KMP]hdoj 4763
2014-10-10 11:39 696题意: 给出一个字符串,问是否存在这样的子串E使得 ... -
[后缀数组][二分]hdu 5008
2014-09-27 10:10 1025大致题意: 给出一个长度小于100000的字符串 ... -
[线段树,单点更新]hdoj 1754:I Hate It
2012-10-21 21:33 1299大致题意: 给出一个数组,在线更新点的值,查询区 ...
相关推荐
AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于信息学奥林匹克竞赛、数据结构与算法竞赛以及文本处理等领域。它的主要功能是高效地在一个字符串集合中进行多模式匹配,即同时查找多个模式串...
AC自动机是一种高效的多模式串匹配算法,主要应用于文本处理中的敏感词过滤、关键词搜索等功能。它的全称为Aho-Corasick算法,由Aho和Corasick在1975年提出。AC自动机在Trie树的基础上进行了扩展,增加了失败指针,...
**支持多线程AC自动机** 在网络安全领域,Snort是一款广泛应用的开源网络入侵检测系统(IDS)。它能够实时分析网络流量,识别潜在的攻击行为。然而,原版的Snort可能在处理大量数据时面临性能瓶颈,因为它通常是单...
AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于文本处理、生物信息学、搜索引擎等领域。这个压缩包包含了多个以".in"为后缀的文件,很可能是用于AC自动机相关的编程练习或测试数据集。 AC...
**AC自动机(Aho-Corasick算法)**是一种在字符串搜索中用于高效查找多个模式串的算法。在中文文本处理中,AC自动机尤其适用,因为它能够一次性处理大量关键词,避免了对文本的多次扫描。这个算法由Aho和Corasick在...
### 多模式匹配:AC自动机与DAWG自动机 #### 概述 多模式匹配是一种在文本中查找多个模式(关键词或字符串)的技术,在数据挖掘、信息安全、生物信息学等多个领域有着广泛的应用。例如,在数据挖掘中可以用于发现...
要学AC自动机需要自备两个前置技能:KMP和trie树(其实个人感觉不会kmp也行,失配指针的概念并不难) 其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要进行回溯,如果模式串很长的话...
### AC自动机详解 #### 一、AC自动机概述 AC自动机(Aho-Corasick Automaton)是一种经典的字符串匹配算法,特别适用于处理多个模式串的匹配问题。它结合了KMP算法的思想以及字典树(Trie)的结构特点,能够有效地在...
AC自动机算法(Aho-Corasick 多模式匹配算法)C#实现
**AC自动机(Aho-Corasick算法)**是一种高效的字符串搜索算法,它基于字典树(Trie)数据结构,能够一次性查找多个模式串在文本中的出现情况。AC自动机的主要优势在于避免了对同一个文本位置多次进行模式匹配,大大...
AC自动机AC自动机AC自动机AC自动机
**AC自动机(Aho-Corasick Algorithm)模板** AC自动机是一种字符串搜索算法,它在文本中查找多个模式串的出现情况。该算法由艾伦·科拉斯和戈登·科拉斯在1975年提出,是KMP算法和后缀自动机的结合,具有高效性和...
AC自动机,全称为Aho-Corasick自动机,是一种在文本中高效地进行多模式串匹配的算法。它的核心思想是构建一个自动机结构,该结构能够在一次遍历文本的过程中,同时匹配多个模式串,大大提高了搜索效率,避免了对每一...
- **高效性**:AC自动机可以在O(n+m)的时间复杂度内完成多模式匹配,其中n是文本的长度,m是所有模式串的总长度。 - **预处理**:通过构建AC自动机,可以将模式串的信息进行预处理,从而加速后续的匹配过程。 - **...
2. `search`:使用AC自动机进行匹配,返回所有匹配项。 3. 可能还有一些辅助函数,如插入模式串、查找失败指针等。 通过阅读和理解这些源代码,你可以更深入地了解AC自动机的内部工作机制,并可能将其应用于实际的...
这个问题和2222类似,只是简化了输出要求,仍然是利用AC自动机来计算单词出现的次数。 - POJ 3691【中等】 在这个题目中,AC自动机被用来解决DNA序列的问题。通过构建AC自动机,可以快速找出目标DNA片段中与致病...
AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于文本处理、数据挖掘等领域。它在ACM(国际大学生程序设计竞赛)中也是一项重要的算法技能,因为它能高效地解决字符串匹配问题,特别是面对...
AC自动机,全称为Aho-Corasick算法,是一种在字符串搜索中用于高效查找多个模式的算法。在Java编程环境中,AC自动机被广泛应用于文本处理、数据分析、搜索引擎等领域,尤其是处理大规模数据时,它的效率尤为突出。这...
- 时间复杂度:AC自动机可以在O(n + m)的时间内完成n个模式在m长度的文本中的查找,其中n是模式串的数量,m是文本的长度。这比朴素的逐个模式匹配方法效率高得多。 - 并行性:AC自动机可以同时检查多个模式,适合...