大致题意:
给出n个模式串,一个文本串,分别求出每个文本串子在模式串中出现的次数。
大致思路:
基本的AC自动机,要修改一些地方。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include <algorithm>
using namespace std;
const int inf=1<<28;
const int nMax=1500;
const int mMax=2000000;
class node{
public:
int id;
int count; //前缀记录标志
node *next[30],*fail;
node(){
id=-1;
count=0;
fail=NULL;
for(int i=0;i<30;i++)next[i]=NULL;
}
}*root,*que[mMax];
int cnt;
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];
}
if(r->id==-1){
r->id=cnt;
cnt++;
}
r->count++;
}
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<30;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 vis[nMax];
void search(char *msg){
int i,idx;
node *p=root,*tmp;
for(i=0;msg[i];i++){
idx=msg[i]-'A';
if(idx<0||idx>26)idx=27;
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=tmp->fail){//&&tmp->count!=-1 因为这里需要求的是该字符串出现的次数
if(tmp->id!=-1)vis[tmp->id]++; //也就是字符需要重复出现,所以这句要注释掉
}
}
}
char str[nMax][55],text[mMax];
int main(){
int n,i,j,flag;
while(scanf("%d",&n)!=EOF){
cnt=1;
root=new node();
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
scanf("%s",str[i]);
insert(str[i]);
}
acAuto();
scanf("%s",text);
search(text);
flag=1;
for(i=1;i<=n;i++){
if(vis[i]!=0){
flag=0;
printf("%s: %d\n",str[i],vis[i]);
}
}
if(flag)printf("\n");
}
return 0;
}
分享到:
相关推荐
AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于信息学奥林匹克竞赛、数据结构与算法竞赛以及文本处理等领域。它的主要功能是高效地在一个字符串集合中进行多模式匹配,即同时查找多个模式串...
**AC自动机(Aho-Corasick算法)**是一种在字符串搜索中用于高效查找多个模式串的算法。在中文文本处理中,AC自动机尤其适用,因为它能够一次性处理大量关键词,避免了对文本的多次扫描。这个算法由Aho和Corasick在...
AC自动机是一种高效的多模式串匹配算法,主要应用于文本处理中的敏感词过滤、关键词搜索等功能。它的全称为Aho-Corasick算法,由Aho和Corasick在1975年提出。AC自动机在Trie树的基础上进行了扩展,增加了失败指针,...
压缩包中的"AC"文件可能是实现多线程AC自动机的源代码、文档或测试数据。进一步分析这些文件可以帮助我们了解具体的实现细节,包括数据结构设计、线程管理和性能优化策略等。 总结来说,支持多线程AC自动机的Snort...
AC自动机的主要思想是构建一个高效的查找结构,能够一次性检查多个模式串(pattern)是否存在于一个大的文本串(text)中,避免了对每个模式串单独进行线性扫描的时间复杂度。它的核心在于将所有模式串的前缀和后缀...
### 多模式匹配:AC自动机与DAWG自动机 #### 概述 多模式匹配是一种在文本中查找多个模式(关键词或字符串)的技术,在数据挖掘、信息安全、生物信息学等多个领域有着广泛的应用。例如,在数据挖掘中可以用于发现...
AC自动机,全称为Aho-Corasick自动机,是一种在文本中高效地进行多模式串匹配的算法。它的核心思想是构建一个自动机结构,该结构能够在一次遍历文本的过程中,同时匹配多个模式串,大大提高了搜索效率,避免了对每一...
要学AC自动机需要自备两个前置技能:KMP和trie树(其实个人感觉不会kmp也行,失配指针的概念并不难) 其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要进行回溯,如果模式串很长的话...
相比于简单的模式匹配算法,AC自动机具有更高的效率,其时间复杂度为O(n+m+z),其中n为所有模式串总长度之和,m为目标串长度,z为模式串在目标串中出现的次数。 #### 二、问题描述 在给定的目标串T[m]中寻找一组...
在刘文的论文中,他利用元胞自动机模型来模拟短信网络中的病毒传播过程。模型假设每个元胞代表一个手机用户,元胞的状态可以是健康或感染。每个用户有一定的概率接收到病毒短信,并根据自身的免疫状态决定是否被感染...
**AC自动机(Aho-Corasick算法)**是一种高效的字符串搜索算法,它基于字典树(Trie)数据结构,能够一次性查找多个模式串在文本中的出现情况。AC自动机的主要优势在于避免了对同一个文本位置多次进行模式匹配,大大...
AC自动机算法(Aho-Corasick 多模式匹配算法)C#实现
在AC自动机中,我们构建一个有限状态自动机(FSA),这个自动机可以同时处理多个模式串,并且一旦找到匹配,就能立即报告,而无需回溯。 **一、AC自动机的基本结构** AC自动机的核心是构建一个带有“失败指针”的...
- **适用于实时搜索**:AC自动机特别适用于实时的文本匹配场景,如网络监控、病毒检测等。 #### 四、AC自动机的基本原理 AC自动机结合了字典树(Trie树)和KMP算法的思想。它通过预处理阶段构建一个自动机,该...
在AC自动机中,每个节点包含一个指向其子节点的指针数组,数组的大小通常与字符集大小相同。例如,在ASCII编码中,大小为256。 2. 失败指针 失败指针是AC自动机的核心,它使得当当前匹配的模式串在文本串中找不到...
AC自动机AC自动机AC自动机AC自动机
- 时间复杂度:AC自动机可以在O(n + m)的时间内完成n个模式在m长度的文本中的查找,其中n是模式串的数量,m是文本的长度。这比朴素的逐个模式匹配方法效率高得多。 - 并行性:AC自动机可以同时检查多个模式,适合...
在提供的文件列表中,`TrietoAC.cpp`和`TrietoAC.h`很可能是实现AC自动机的源代码,而`main.cpp`可能包含测试用例和驱动程序。这些文件可能包括以下关键函数: 1. `buildACAutomaton`:构建AC自动机,包括字典树和...
AC自动机,全称为Aho-Corasick算法,是一种在字符串搜索中用于高效查找多个模式的算法。在Java编程环境中,AC自动机被广泛应用于文本处理、数据分析、搜索引擎等领域,尤其是处理大规模数据时,它的效率尤为突出。这...
在这个压缩包中,`ac_automaton.c`是AC自动机的实现源文件,包含了自动机的构建和查询功能。`using.c`是一个示例程序,展示了如何调用AC自动机库进行字符串匹配操作。`ac_automaton.h`则是对应的头文件,定义了相关...