hdu 3065 病毒侵袭持续中

来源:互联网 发布:指纹定位算法 编辑:程序博客网 时间:2024/05/01 23:16

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065

题目大意及思路:ac自动机。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define Max 1100int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int q[60*Max],cnt;char s[2001000];char str[Max][60];int hash[Max];struct node{    int id,fail;    int next[26];    void init()    {        memset(next,0,sizeof(next));        id=fail=0;    }}tri[60*Max];void insert(char *s,int id){    int i,p,x;    p=0;    for(i=0;s[i];i++)    {        x=s[i]-'A';        if(!tri[p].next[x])        {            tri[++cnt].init();            tri[p].next[x]=cnt;        }        p=tri[p].next[x];    }    tri[p].id=id;}void bfs(){    int i,p,suf,head=0,tail=0;    p=0;    for(i=0;i<26;i++)    {        if(tri[0].next[i])        {            q[tail++]=tri[0].next[i];            tri[q[tail-1]].fail=0;        }        else            tri[0].next[i]=0;    }    while(head<tail)    {       // printf("akkk\n");        p=q[head++];suf=tri[p].fail;        for(i=0;i<26;i++)        {            if(tri[p].next[i])            {                q[tail++]=tri[p].next[i];                tri[q[tail-1]].fail=tri[suf].next[i];            }            else                tri[p].next[i]=tri[suf].next[i];        }    }}void query(char *s){    int i,x,p,tmp;    p=0;    memset(hash,0,sizeof(hash));    for(i=0;s[i];i++)    {        x=s[i]-'A';        if(x>=0&&x<26)        {            p=tri[p].next[x];            tmp=p;            while(tmp)            {                if(tri[tmp].id)                {                    hash[tri[tmp].id]++;                }                tmp=tri[tmp].fail;            }        }        else            p=0;    }}int main(){    int i,n;//char str[60];    while(scanf("%d",&n)!=EOF)    {        cnt=0;        tri[0].init();        for(i=1;i<=n;i++)        {            scanf("%s",str[i]);            insert(str[i],i);        }      //  printf("c");        bfs();////printf("e");        scanf("%s",s);    //    printf("f");        query(s);        for(i=1;i<=n;i++)        {            if(hash[i])            printf("%s: %d\n",str[i],hash[i]);        }    }}


 

原创粉丝点击