HDU3065 病毒侵袭持续中 AC自动机

来源:互联网 发布:qq飞车b车大黄蜂数据 编辑:程序博客网 时间:2024/05/22 03:18

又是一道模板题。

#include<stdio.h>#include<string.h>#include<queue>using namespace std;int n,ch[52000][26],val[52000],fail[52000],tot,root,ans;int solve[1001];char tt[1001][52],sorce[2000002],fea[52];queue<int>q;int newnode(){    memset(ch[tot],0,sizeof(ch[tot]));    val[tot]=0;    return tot++;}void update(char *a,int no){    int i,len=strlen(a),cur=root;    for(i=0;i<len;i++)    {        if(!ch[cur][a[i]-'A'])            ch[cur][a[i]-'A']=newnode();        cur=ch[cur][a[i]-'A'];    }    val[cur]=no;    strcpy(tt[no],a);}void getfail(){    fail[root]=root;    for(int i=0;i<26;i++)        if(ch[root][i])        {            fail[ch[root][i]]=root;            q.push(ch[root][i]);        }    while(!q.empty())    {        int cur=q.front();        q.pop();        for(int i=0;i<26;i++)            if(!ch[cur][i])                ch[cur][i]=ch[fail[cur]][i];            else            {                fail[ch[cur][i]]=ch[fail[cur]][i];                q.push(ch[cur][i]);            }    }}void query(){    int cur=root,i,len=strlen(sorce);    for(i=0;i<len;i++)    {        if(sorce[i]>='A'&&sorce[i]<='Z')        {            cur=ch[cur][sorce[i]-'A'];        }        else cur=root;        int temp=cur;        while(temp!=root&&val[temp])        {            solve[val[temp]]++;            temp=fail[temp];        }    }    for(i=1;i<=n;i++)        if(solve[i])        {            printf("%s: %d\n",tt[i],solve[i]);        }}int main(){    while(~scanf("%d",&n))    {        int i,j,k;        tot=0;        root=newnode();        memset(solve,0,sizeof(solve));        for(i=1;i<=n;i++)        {            scanf("%s",&fea);            update(fea,i);        }        getchar();        getfail();        gets(sorce);        query();    }    return 0;}


0 0
原创粉丝点击