hdu3065 AC自动机

比较简单。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define kind 96
#define maxn 2000000
struct node
{
    node *fail;
    node *next[kind];
    int flag;
    int id;
    void init(){
        fail=NULL;
        memset(next,NULL,sizeof(next));
        flag=0;
        id=0;
    }
}*q[500000];
node *root;
int head,tail;
char str[1002][52],s[maxn];
int vis[1005];
void insert(char *s,int c)
{
    node *p=root,*qq;
    int i,j,len=strlen(s);
    for(i=0;i<len;i++)
    {
        int id=s[i]-32;
        if(p->next[id]==NULL)
        {
            qq=new node;
            qq->init();
            p->next[id]=qq;
        }
        p=p->next[id];
    }
    p->flag++;
    p->id=c;
}
void build_ac()
{
    int i;
    node *temp,*p;
    head=tail=0;
    q[tail++]=root;
    while(head!=tail)
    {
        p=q[head++];
        for(i=0;i<kind;i++)
        {
            if(p->next[i]!=NULL)
            {
                if(p==root)
                    p->next[i]->fail=root;
                else
                {
                    temp=p->fail;
                    while(temp!=NULL)
                    {
                        if(temp->next[i]!=NULL)
                        {
                            p->next[i]->fail=temp->next[i];
                            break;
                        }
                        temp=temp->fail;
                    }
                    if(temp==NULL)
                        p->next[i]->fail=root;
                }
                q[tail++]=p->next[i];
            }
        }
    }
}
void query(char *s)
{
    node *p=root,*temp;
    int i,j,len=strlen(s);
    for(i=0;i<len;i++)
    {
        int id=s[i]-32;
        while(p->next[id]==NULL&&p!=root)
        {
            p=p->fail;
        }
        p=p->next[id];
        if(p==NULL)
            p=root;
        temp=p;
        while(temp!=root&&temp->flag>0)
        {
            vis[temp->id]++;
            temp=temp->fail;
        }
    }
}
void freenode(node *root)
{
    for(int i=0;i<kind;i++)
    {
        if(root->next[i]!=NULL)
            freenode(root->next[i]);
    }
    free(root);
}
int main()
{
    int i,j,n;
    while(scanf("%d",&n)!=EOF)
    {
        root=new node;
        root->init();
        memset(vis,0,sizeof(vis));
        for(i=1;i<=n;i++)
        {
            scanf("%s",str[i]);
            insert(str[i],i);
        }
        build_ac();
        scanf("%s",s);
        query(s);
        for(i=1;i<=n;i++)
        {
            if(vis[i]>0)
                printf("%s: %d
",str[i],vis[i]);
        }
        freenode(root);
    }
}
原文地址:https://www.cnblogs.com/sweat123/p/4741383.html