`
暴风雪
  • 浏览: 385072 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[AC自动机]hdoj 2896:病毒侵袭

阅读更多

大致题意:
    给出n个模式串,m个文本串。对于每个文本串,求出哪些模式串在这个文本串中出现过。最后求出能够包含模式串的文本串总数。

 

大致思路:

    ac自动机模版的小小变形,要注意字符集是所有128个ASCII码可见字符。这道题用静态字典树的优化效果并不明显。

 

#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[130],*fail;
}*root,*que[mMax],num[500000];
bool vist[mMax];
int x,cnt;
node *newnode(){
    node * p = num + x++;
    for(int i = 0; i <130; i++){
        p->next[i] = NULL;
    }
    p->id=-1;
    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];
        if(r->next[loc]==NULL){
            r->next[loc]=newnode();
        }
        r=r->next[loc];
    }
    if(r->id==-1)r->id=cnt++;
    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<130;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];
        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->vis!=-1
           // ans+=tmp->vis;
            tmp->vis=-1;
            if(tmp->id!=-1){
                ans=1;
                vist[tmp->id]=1;
            }
        }
    }
    return ans;
}

int main(){
    int n,m,i,sum;
    char str[502],text[10002];
    while(scanf("%d",&n)!=EOF){
        x=0;
        sum=0;
        cnt=1;
        root=newnode();
        for(i=0;i<n;i++){
            scanf("%s",str);
            insert(str);
        }
        acAuto();
        scanf("%d",&m);
        for(i=1;i<=m;i++){
            memset(vist,0,sizeof(vist));
            scanf("%s",text);
            if(search(text)!=0){
                sum++;
                printf("web %d:",i);
                for(int j=1;j<=n;j++){
                    if(vist[j]){
                        printf(" %d",j);
                    }
                }
                printf("\n");
            }
        }
        printf("total: %d\n",sum);
    }
    return 0;
}
 

 

2
1
分享到:
评论

相关推荐

    AC自动机_AC自动机模板_

    AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于信息学奥林匹克竞赛、数据结构与算法竞赛以及文本处理等领域。它的主要功能是高效地在一个字符串集合中进行多模式匹配,即同时查找多个模式串...

    36丨AC自动机:如何用多模式串匹配实现敏感词过滤功能?1

    AC自动机是一种高效的多模式串匹配算法,主要应用于文本处理中的敏感词过滤、关键词搜索等功能。它的全称为Aho-Corasick算法,由Aho和Corasick在1975年提出。AC自动机在Trie树的基础上进行了扩展,增加了失败指针,...

    支持多线程AC自动机

    **支持多线程AC自动机** 在网络安全领域,Snort是一款广泛应用的开源网络入侵检测系统(IDS)。它能够实时分析网络流量,识别潜在的攻击行为。然而,原版的Snort可能在处理大量数据时面临性能瓶颈,因为它通常是单...

    AC自动机最全数据,欢迎下载

    AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于文本处理、生物信息学、搜索引擎等领域。这个压缩包包含了多个以".in"为后缀的文件,很可能是用于AC自动机相关的编程练习或测试数据集。 AC...

    中文高性能AC自动机代码

    **AC自动机(Aho-Corasick算法)**是一种在字符串搜索中用于高效查找多个模式串的算法。在中文文本处理中,AC自动机尤其适用,因为它能够一次性处理大量关键词,避免了对文本的多次扫描。这个算法由Aho和Corasick在...

    多模式匹配 ac自动机 dawg自动机

    ### 多模式匹配:AC自动机与DAWG自动机 #### 概述 多模式匹配是一种在文本中查找多个模式(关键词或字符串)的技术,在数据挖掘、信息安全、生物信息学等多个领域有着广泛的应用。例如,在数据挖掘中可以用于发现...

    ac自动机.pptx

    要学AC自动机需要自备两个前置技能:KMP和trie树(其实个人感觉不会kmp也行,失配指针的概念并不难) 其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要进行回溯,如果模式串很长的话...

    AC自动机.pdf

    ### AC自动机详解 #### 一、AC自动机概述 AC自动机(Aho-Corasick Automaton)是一种经典的字符串匹配算法,特别适用于处理多个模式串的匹配问题。它结合了KMP算法的思想以及字典树(Trie)的结构特点,能够有效地在...

    AC自动机算法(Aho-Corasick 多模式匹配算法)

    AC自动机算法(Aho-Corasick 多模式匹配算法)C#实现

    基于元胞自动机的短信网络病毒传播模拟

    综上所述,基于元胞自动机的短信网络病毒传播模拟是利用数学模型来理解和预测现实世界复杂现象的有效方法。通过对病毒传播的模拟,我们可以更好地了解其动态过程,为网络安全提供理论支持和应对策略。

    AC自动机

    **AC自动机(Aho-Corasick算法)**是一种高效的字符串搜索算法,它基于字典树(Trie)数据结构,能够一次性查找多个模式串在文本中的出现情况。AC自动机的主要优势在于避免了对同一个文本位置多次进行模式匹配,大大...

    AC自动机AC自动机。。。。

    AC自动机AC自动机AC自动机AC自动机

    AC自动机模板

    **AC自动机(Aho-Corasick Algorithm)模板** AC自动机是一种字符串搜索算法,它在文本中查找多个模式串的出现情况。该算法由艾伦·科拉斯和戈登·科拉斯在1975年提出,是KMP算法和后缀自动机的结合,具有高效性和...

    AC自动机详解+例题详解

    - **适用于实时搜索**:AC自动机特别适用于实时的文本匹配场景,如网络监控、病毒检测等。 #### 四、AC自动机的基本原理 AC自动机结合了字典树(Trie树)和KMP算法的思想。它通过预处理阶段构建一个自动机,该...

    AC自动机实现多模式串匹配,支持中文

    AC自动机,全称为Aho-Corasick自动机,是一种在文本中高效地进行多模式串匹配的算法。它的核心思想是构建一个自动机结构,该结构能够在一次遍历文本的过程中,同时匹配多个模式串,大大提高了搜索效率,避免了对每一...

    字典树实现AC自动机

    AC自动机(Aho-Corasick自动机)是一种高效的算法,用于解决多模式字符串匹配问题。它结合了字典树(Trie树)的数据结构,能够一次性查找多个模式串在文本中的出现情况。接下来,我们将深入探讨AC自动机的工作原理、...

    ac自动机java版

    AC自动机,全称为Aho-Corasick算法,是一种在字符串搜索中用于高效查找多个模式的算法。在Java编程环境中,AC自动机被广泛应用于文本处理、数据分析、搜索引擎等领域,尤其是处理大规模数据时,它的效率尤为突出。这...

    AC自动机 C语言 ACM 字符串匹配|AC自动机C语言.rar

    AC自动机,全称为Aho-Corasick自动机,是一种字符串搜索算法,广泛应用于文本处理、数据挖掘等领域。它在ACM(国际大学生程序设计竞赛)中也是一项重要的算法技能,因为它能高效地解决字符串匹配问题,特别是面对...

    AC自动机程序资料合集

    - 时间复杂度:AC自动机可以在O(n + m)的时间内完成n个模式在m长度的文本中的查找,其中n是模式串的数量,m是文本的长度。这比朴素的逐个模式匹配方法效率高得多。 - 并行性:AC自动机可以同时检查多个模式,适合...

    自己写的ac自动机,STL实现

    相当给力,头文件中附带了简单的使用方法,使用istream当接口,因此你可以传入stringstream或fstream,甚至可以自己派生istream再传入,支持全文查找和增量查找两种模式,有问题可以联系我

Global site tag (gtag.js) - Google Analytics