AC日记——Keywords Search hdu 2222

2222

 

思路:

  ac自动机模板题;

 

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 500005

struct TreeNodeType {
    int count;
    
    TreeNodeType *fail;
    
    TreeNodeType *next[26];
    
    TreeNodeType()
    {
        fail=NULL,count=0;
        for(int i=0;i<26;i++) next[i]=NULL;
    }
};
struct TreeNodeType *root,*que[maxn];

int n;

char str[maxn*2],word[100];

inline void in(int &now)
{
    char Cget=getchar();now=0;
    while(Cget>'9'||Cget<'0') Cget=getchar();
    while(Cget>='0'&&Cget<='9')
    {
        now=now*10+Cget-'0';
        Cget=getchar();
    }
}

void insert(char *ch)
{
    int temp,len=strlen(ch);
    TreeNodeType *p=root;
    for(int i=0;i<len;i++)
    {
        temp=ch[i]-'a';
        if(p->next[temp]==NULL) p->next[temp]=new TreeNodeType;
        p=p->next[temp];
    }
    p->count++;
}

void build()
{
    int tail=1,head=0;que[head]=root;
    while(head<tail)
    {
        TreeNodeType *p=que[head++],*temp=NULL;
        for(int i=0;i<26;i++)
        {
            if(p->next[i]==NULL) continue;
            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;
            }
            que[tail++]=p->next[i];
        }
    }
}

int query()
{
    int pos,len=strlen(str),res=0;TreeNodeType *p=root;
    for(int i=0;i<len;i++)
    {
        pos=str[i]-'a';
        while(p->next[pos]==NULL&&p!=root) p=p->fail;
        if(p->next[pos]!=NULL) p=p->next[pos];else p=root;
        TreeNodeType *temp=p;
        while(temp!=root&&temp->count!=-1) res+=temp->count,temp->count=-1,temp=temp->fail;
    }
    return res;
}

int main()
{
    int T;
    in(T);
    while(T--)
    {
        root=new TreeNodeType;
        in(n);for(int i=1;i<=n;i++) gets(word),insert(word);
        build(),scanf("%s",str),printf("%d\n",query());
    }
    return 0;
}

 

posted @ 2017-05-15 09:14  IIIIIIIIIU  阅读(210)  评论(0编辑  收藏  举报