HDU 3065 病毒侵袭持续中 (AC自动机)

原创 2015年07月07日 19:50:17
///要求记录子串在匹配串重复出现的个数
# include <algorithm>
# include <stdio.h>
# include <queue>
# include <string.h>
using namespace std;
# define kind 128
struct node
{
    node *fail;
    node *next[kind];
    int cnt;//是否为该单词的最后一个节点
   // int index;
    node()
    {
        cnt=0;
        fail=NULL;
        memset(next,NULL,sizeof(next));
    }
};
char str[1010][55],a[2000010];
queue<node*>qq;
void Buildtree(node *root,int index)
{
    node *p=root;
    int i=0,id;
    while(str[index][i])
    {
        id=str[index][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();
    qq.push(root);
    root->fail=NULL;
    node *tmp,*p;
    while(!qq.empty())
    {
        tmp=qq.front();
        qq.pop();
        p=NULL;
        for(int i='A'; i<='Z'; i++)
        {
            if(tmp->next[i]!=NULL)
            {
                p=tmp->fail;
                while(p&&!p->next[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[1010];
void 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=p->fail;
        p=p->next[id];
        if(!p)
            p=root;
        node *tmp=p;
        while(tmp!=root)
        {
          // tmp->cnt==-1   表示计算过 这题可重复计算
          if(tmp->cnt)
          has[tmp->cnt]++;
          tmp=tmp->fail;
        }
        i++;
    }
}
void del(node *p)///释放内存
{
    for(int i=0;i<kind;i++)
    {
        if(p->next[i]!=NULL)
            del(p->next[i]);
    }
    delete p;
}
int main()
{
    int n,i;
    while(~scanf("%d",&n))
    {
        node *root=new node();
        for(i=1; i<=n; i++)
        {
            scanf("%s",str[i]);
            Buildtree(root,i);
        }
        bfs(root);
        memset(has,0,sizeof(has));
        scanf("%s",a);
        Ac_run(root);
        del(root);
        for(i=1; i<=n; i++)
        {
            if(has[i])
            {
                printf("%s: %d\n",str[i],has[i]);
            }
        }
    }
    return 0;
}

hdu 3065 病毒侵袭持续中

全全类似kmp般的匹配,需要注意的是 当出现不合法字符的时候 要p
  • wdcjdtc
  • wdcjdtc
  • 2014年05月20日 20:14
  • 488

HDU2896 病毒侵袭 AC自动机

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

HDU 3065 病毒侵袭持续中 (AC自动机 + hdu有毒)

原题网址:http://acm.hdu.edu.cn/showproblem.php?pid=3065题意:因为是中文题,我就不翻译成英语了。。。思路:ac自动机的模板题。吐槽:hdu有毒,明明没说多...
  • wing_wuchen
  • wing_wuchen
  • 2016年07月30日 09:28
  • 180

HDU 3065:病毒侵袭持续中(AC自动机)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • wugj03
  • wugj03
  • 2011年09月06日 22:46
  • 484

HDU 3065 病毒侵袭持续中 AC自动机

/* 很裸的AC自动机, 关键是如何去掉模式串中的不相干字符 */ #include #include #include #include #include #include usi...
  • wsniyufang
  • wsniyufang
  • 2011年10月01日 21:01
  • 537

[hdu 3065] 病毒侵袭持续中(AC自动机)

每次查出一个匹配的keyword就把相应的值加一即可。注意到特征码只由大写字母组成,所以长串碰到其他字符就直接可以跳过。#includeusing namespace std;struct node{...
  • u014204710
  • u014204710
  • 2014年04月14日 14:41
  • 395

HDU - 3065 - 病毒侵袭持续中(AC自动机)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su...
  • j6635788
  • j6635788
  • 2016年08月05日 15:26
  • 164

HDU 3065 病毒侵袭持续中 AC自动机题解

其实本题比HDU的病毒侵袭1还简单,不过有一个陷阱卡到我了:就是搜索text的时候,当遇到的字母不是大写字母的时候,那么就要重新从根节点开始搜索,否则就会答案错误。 那么一点陷阱,居然没想到啊。 ...
  • kenden23
  • kenden23
  • 2014年08月07日 22:23
  • 729

HDU 3065 病毒侵袭持续中 (AC自动机)

http://acm.hdu.edu.cn/showproblem.php?pid=3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) ...
  • xiangAccepted
  • xiangAccepted
  • 2017年06月27日 16:17
  • 128

HDU 3065 病毒侵袭持续中 ac自动机

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意: Problem Description 小t非常感谢大家帮忙解决了...
  • discreeter
  • discreeter
  • 2016年07月30日 13:25
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3065 病毒侵袭持续中 (AC自动机)
举报原因:
原因补充:

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