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

#include <stdio.h>
#include <string.h>

 


#define MAXKIND 129
#define MAXN 505
#define MAXLEN 10005
#define MAXQSIZE 500005

typedef struct TNode
{
    TNode()
    {
        id=-1;
        fail=NULL;
        memset(next,0,sizeof(next));
    }
    int id;
    TNode *fail;
    TNode *next[MAXKIND];
}*Trie;

void insert(Trie p,char *key,int idx)
{
    while(*key)
    {
        int i=*key;
        if(!p->next[i]) p->next[i]=new TNode;
        p=p->next[i];
        key++;
    }
    p->id=idx;
}

TNode *que[MAXQSIZE];
void build_ac(Trie root)
{
    root->fail=NULL;
    int front=-1,rear=-1;
    que[++rear]=root;
    TNode *out;
    while(front<rear)
    {
        out=que[++front];
        for(int i=0;i<MAXKIND;i++)
        {
            if(out->next[i])
            {
                que[++rear]=out->next[i];
                if(out==root) out->next[i]->fail=root;
                else
                {
                    TNode *tmp=out->fail;
                    while(tmp)
                    {
                        if(tmp->next[i])
                        {
                            out->next[i]->fail=tmp->next[i];
                            break;
                        }
                        tmp=tmp->fail;
                    }
                    if(!tmp) out->next[i]->fail=root;
                }
            }
        }
    }
}

bool search(Trie root,char *pat,bool *arr)
{
    int i;
    bool flag=false;
    TNode *p=root;
    while(*pat)
    {
        i=*pat;
        while(!p->next[i] && p!=root) p=p->fail;
        p=p->next[i];
        if(!p) p=root;
        TNode *tmp=p;
        while(tmp->id != -1 && !arr[tmp->id] && tmp != root)
        {
            arr[p->id]=true;
            flag=true;
            tmp=tmp->fail;
        }
        pat++;
    }
    return flag;
}

char str[MAXLEN];
bool tag[MAXN];

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
    #endif
    int i,n,m;
    while(scanf("%d",&n)!=EOF)
    {
        memset(tag,false,sizeof(tag));
        Trie tree=new TNode;
        for(i=1;i<=n;i++)
        {
            scanf("%s",str);
            insert(tree,str,i);
        }
        build_ac(tree);
        scanf("%d",&m);
        int cnt=0;
        for(i=1;i<=m;i++)
        {
            scanf("%s",str);
            if( search(tree,str,tag) )
            {
                cnt++;
                printf("web %d:",i);
                for(int j=1;j<MAXN;j++)
                    if(tag[j]) printf(" %d",j);
                printf("\n");
                memset(tag,false,sizeof(tag));
            }
        }
        printf("total: %d\n",cnt);
    }
    return 0;
}

posted @ 2010-09-04 19:01  菜到不得鸟  阅读(253)  评论(0)    收藏  举报