hdu 2896 病毒侵袭 (AC自动机模版)

原创 2015年07月06日 21:56:17
<span style="font-family: Arial, Helvetica, sans-serif;">//没有重复单词</span>
<span style="font-family: Arial, Helvetica, sans-serif;"># include <stdio.h></span>
# include <algorithm>
# include <queue>
# include <string.h>
using namespace std;
# define kind 128
struct node
{
    node *fail;//失败指针
    node *next[kind];//树每个节点的子节点   trie树的分支是128的
    int cnt;//是否为该单词的最后一个节点
    node()//构造函数初始化
    {
        fail=NULL;
        cnt=0;
        memset(next,NULL,sizeof(next));
    }
};
char str[210];///输入的单词
char a[10010];///输入的模式串
queue<node*>qq;///队列构造失败指针
void BuildTree(node *root ,int index)//建Trie树
{
    node *p=root;
    int i=0,id;
    while(str[i])
    {
        id=str[i];
        if(p->next[id]==NULL)
            p->next[id]=new node();
        p=p->next[id];
        i++;
    }
    (p->cnt)=index;///表示是一个单词的结尾
}
void bfs(node *root)///求失败指针
{
    while(!qq.empty())
        qq.pop();
    root->fail=NULL;
    qq.push(root);
    root->fail=NULL;
    node *tmp,*p;
    while(!qq.empty())
    {
        tmp=qq.front();///拿到一个节点
        qq.pop();
        p=NULL;
        for(int i=0; i<kind; i++)
        {
            if(tmp->next[i]!=NULL)
            {
                p=tmp->fail;
                while(p&&!p->next[i])///p:当前点tmp不是根  !p->next[i]: 还能找到i这个字母在
                    p=p->fail;
                if(!p)
                    tmp->next[i]->fail=root;
                else
                    tmp->next[i]->fail=p->next[i];
                qq.push(tmp->next[i]);
            }
        }
    }

}
int has[600];
int Ac_run(node *root)
{
    int i=0,ans=0,id;
    node *p=root;
    while(a[i])
    {
        id=a[i];
        while(!p->next[id]&&p!=root)///p下面没有id字母
            p=p->fail;
        p=p->next[id];
        if(!p)
            p=root; ///while结束 如果是根的情况
        node *tmp=p;
        while(tmp!=root&&tmp->cnt!=-1)
        {
            ///cnt=-1表示已经计算过

            if(tmp->cnt!=0)
            {
                ans+=tmp->cnt;
                has[tmp->cnt]=1;
            }
            tmp=tmp->fail;
        }
        i++;
    }
    return ans;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        node *root=new node();
        for(int i=1; i<=n; i++)
        {
            scanf("%s",str);
            BuildTree(root,i);
        }
        bfs(root);
        int m;
        scanf("%d",&m);
        int total=0;
        for(int i=1; i<=m; i++)
        {
            memset(has,0,sizeof(has));
            scanf("%s",a);
            if(Ac_run(root))
            {
                total++;
                printf("web %d:",i);

                for(int j=1; j<=n; j++)
                {
                    if(has[j])
                        printf(" %d",j);
                }
                puts("");
            }

        }
        printf("total: %d\n",total);
    }
    return 0;
}

HDU2896 病毒侵袭 AC自动机

题目大意:给出n个病毒和n个网站,找出每一个网站中含有的病毒种类,并按病毒编号升序输出,最后统计含有病毒的网站个数。 分析:比较裸的AC自动机的题,我们可以在构造tire树的过程中顺便把编号...
  • AC_Gibson
  • AC_Gibson
  • 2015年05月08日 10:30
  • 765

hdu 2896 病毒侵袭(AC自动机)

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • acm_cxq
  • acm_cxq
  • 2016年07月16日 22:22
  • 746

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

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • j6635788
  • j6635788
  • 2016年08月05日 14:18
  • 82

hdu 2896 病毒侵袭 (AC自动机)

题目大意:给你一堆病毒串,再给你一些网站,问每个网站是否包含病毒串,若包括,包括哪几个病毒串,还有一共有几个网站包含病毒串。 啊啊,自己第一道AC自动机的题,还是比较简单的模板题吧,过几天要...
  • dyx404514
  • dyx404514
  • 2013年05月16日 22:01
  • 825

【HDU】2896 病毒侵袭 AC自动机

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • u013368721
  • u013368721
  • 2014年06月27日 11:53
  • 552

hdu 2896 病毒侵袭 -- AC自动机

/* 寻找都有哪些子串 不能保证是字母或数字,所以子节点有差不多130个 */ #include #include #include using namespace std; int bi...
  • qq172108805
  • qq172108805
  • 2013年03月30日 14:24
  • 820

HDU 2896 病毒侵袭(AC自动机)

解题思路: 对AC自动机算法的理解和应用,要注意的是,题目中的字符是128个ASCII码,而不是常用的26个英文字符,因此子节点的数目为128. #include #include #incl...
  • u013967323
  • u013967323
  • 2015年06月01日 18:18
  • 326

hdu 2896 病毒侵袭 AC自动机

AC自动机模板。学习的是学长的写法,感觉很好。 #include #include #include #include using namespace std; const int N ...
  • u012576214
  • u012576214
  • 2015年10月07日 13:22
  • 208

HDU 2896 病毒侵袭 (AC自动机)

病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观...
  • AC_road
  • AC_road
  • 2016年04月25日 18:05
  • 189

Hdu 2896 病毒侵袭(AC自动机)

病毒侵袭 Time Limit: 2000 Memory Limit: 32768 Total Submission(s): 24853 Accepted Submission(s...
  • sinat_34550050
  • sinat_34550050
  • 2017年03月13日 11:25
  • 150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 2896 病毒侵袭 (AC自动机模版)
举报原因:
原因补充:

(最多只允许输入30个字)