美文网首页DataStructure
HDU-2896-病毒入侵(AC自动机)

HDU-2896-病毒入侵(AC自动机)

作者: 雨落八千里 | 来源:发表于2019-08-08 14:44 被阅读0次

病毒入侵

注意:这个病毒是ASCII码可见字符,不仅仅是小写字母。(卡了半天)

#include<bits/stdc++.h>
using namespace std;
const int M=101000;
int tree[M][128];
int num[M];
int fail[M];
char s[M];
int pos=1;
int vis[M];
priority_queue<int,vector<int>,greater<int> >q;
void insert(char *s,int cnt)
{
    int len=strlen(s);
    int root=0;
    for(int i=0;i<len;i++)
    {
        int x=s[i];
        if(!tree[root][x])
        {
            tree[root][x]=pos;
            pos++;
        }
        root=tree[root][x];
    }
    num[root]=cnt;//记录病毒序号
}
void getfail( )
{
    queue<int>qu;
    for(int i=0;i<128;i++)
    {
        if(tree[0][i])
        {
            fail[tree[0][i]]=0;
            qu.push(tree[0][i]);
        }
    }
    while(!qu.empty( ))
    {
        int u=qu.front( );
        qu.pop( );
        for(int i=0;i<128;i++)
        {
            if(tree[u][i])
            {
                fail[tree[u][i]]=tree[fail[u]][i];
                qu.push(tree[u][i]);
            }
            else
            {
                tree[u][i]=tree[fail[u]][i];
            }
        }
    }
}
void query(char *s)
{
    memset(vis,0,sizeof(vis));
    int len=strlen(s);
    int root=0;
    for(int i=0;i<len;i++)
    {
        int x=s[i];
        root=tree[root][x];
        for(int j=root;j&&num[j];j=fail[j])
        {
            if(vis[num[j]]==0)//防止病毒序号重复记录
            {
                q.push(num[j]);
                vis[num[j]]=1;
            }
            
        }
    }
}
int main( )
{
    int n,m,cnt=0;
    scanf("%d",&n);
    getchar( );
    while(n--)
    {
        cnt++;
        scanf("%s",s);
        insert(s,cnt);
    }
    fail[0]=0;
    getfail( );
    scanf("%d",&m);
    getchar( );
    cnt=0;
    int ans=0;
    while(m--)
    {
        cnt++;
        while(!q.empty( ))
        {
            q.pop( );
        }
        scanf("%s",s);
        query(s);
        if(!q.empty( ))
        {
            ans++;
            printf("web %d:",cnt);
            while(!q.empty( ))
            {
                printf(" %d",q.top( ));
                q.pop( );
            }
            printf("\n");
        }
    }
    printf("total: %d\n",ans);
    return 0;
}

相关文章

  • HDU-2896-病毒入侵(AC自动机)

    病毒入侵注意:这个病毒是ASCII码可见字符,不仅仅是小写字母。(卡了半天)

  • AC自动机 专题整理

    AC自动机学习记录 参考资料 字典树(讲解+模版)AC自动机算法AC自动机算法详解hdu 2222 ac自动机入门...

  • 自动AC机?不,是AC自动机

    今天我们来介绍一点进阶的知识——AC自动机。 AC自动机是啥 AC自动机是什么呢?是不是用了这个算法,不管什么题目...

  • 【AC自动机】AC自动机可以帮你自动AC吗

    参考博文:AC自动机算法详解 (转载) (原文作者:DarkRaven,原文的链接失效了)图片来源:AC自动机算...

  • AC自动机-去除敏感字符

    AC自动机 AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名...

  • lucene中文分词

    IK中文分词 DoubleArrayTrie的AC自动机

  • 字符串算法小结

    hash kmp和ac自动机 后缀数组,后缀自动机,后缀树 扩展kmp manacher算法 回文自动机 可删改的...

  • AC 自动机

    AC自动机 AC自动机是一个经典的多模式串匹配算法,它可以实现对主串的一次扫描来匹配多个模式串的功能。实现AC自动...

  • 回文树(附模板题URAL-1960)

    (最好事先学习过kmp,Trie,AC自动机)回文树,有效解决各类回文问题的超级666的树形结构 集AC自动机的f...

  • AC自动机_模板

    AC自动机: 求多个字符串是否在主串中出现过。可依据情况分别求出出现次数,出现位置等。 AC自动机入门Keywor...

网友评论

    本文标题:HDU-2896-病毒入侵(AC自动机)

    本文链接:https://www.haomeiwen.com/subject/uydxjctx.html