hdu2222Keywords Search AC自动机模板题


 

Description

In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. 
Wiskey also wants to bring this feature to his image retrieval system. 
Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched. 
To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match. 
 

Input

First line will contain one integer means how many cases will follow by. 
Each case will contain two integers N means the number of keywords and N keywords follow. (N <= 10000) 
Each keyword will only contains characters 'a'-'z', and the length will be not longer than 50. 
The last line is the description, and the length will be not longer than 1000000. 
 

Output

Print how many keywords are contained in the description.
 

Sample Input

1 5 she he say shr her yasherhs
 

Sample Output

3
 

Sample Output

3
 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 500010
char str[1000010],keyword[51];
int head,tail;
struct node
{
    node *fail;
    node *next[26];
    int count;
    node()
    {
        fail=NULL;
        count=0;
        for(int i=0;i<26;i++) next[i]=NULL;
    }
}
*q[N];
node *root;
void insert(char *str)
{
    int temp,len;
    node *p=root;
    len=strlen(str);
    for(int i=0;i<len;i++)
    {
        temp=str[i]-'a';
        if(p->next[temp]==NULL) p->next[temp]=new node();
        p=p->next[temp];
    }
    p->count++;
}
void build_ac()
{
    q[tail++]=root;
    while(head!=tail)
    {
        node *p=q[head++];
        node *temp=NULL;
        for(int i=0;i<26;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];
            }
        }
    }
}
int query()
{
    int index,len,result;
    node *p=root;
    result=0;
    len=strlen(str);
    for(int i=0;i<len;i++)
    {
        index=str[i]-'a';
        while(p->next[index]==NULL&&p!=root) p=p->fail;
        p=p->next[index];
        if(p==NULL) p=root;
        node *temp=p;
        while(temp!=root&&temp->count!=-1)
        {
            result+=temp->count;
            temp->count=-1;
            temp=temp->fail;
        }
    }
    return result;
}
int main()
{
  //  freopen("cin.txt","r",stdin);
    int ncase,num;
    scanf("%d",&ncase);
    while(ncase--)
    {
        head=tail=0;
        root=new node();
        scanf("%d",&num);
        getchar();
        for(int i=0;i<num;i++)
        {
            gets(keyword);
            insert(keyword);
        }
        build_ac();
        scanf("%s",str);
        printf("%d\n",query());
    }
    return 0;
}

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务