码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2222 Keywords Search

时间:2017-12-23 16:01:29      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:targe   for   cstring   赋值   search   net   sea   scan   .net   

Keywords Search

 HDU - 2222 

给出n个单词和一个句子,问有多少单词在句子中出现过

 

/*
    困惑了很久为什么要for(int i=0;i<=25;i++)a[0][i]=1;这样预处理,原因是我们将1作为根节点,就需要将fail指针无处可指的点的fail指针指向1,而我们又知道fail指针指向一个点的充分条件是这个点有一个可以指向这个字母的边,所以将a[0][i]全都赋值成1
    当然fail无处可指的情况也可以特判一下。 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 500010
#define M 1000010
using namespace std;
int a[N][26],danger[N],point[N],mark[N],q[N],n,size;
char ch[M];
void insert(){
    int len=strlen(ch),now=1;
    for(int i=0;i<len;i++){
        int t=ch[i]-a;
        if(!a[now][t])a[now][t]=++size;
        now=a[now][t];
    }
    danger[now]++;
}
void acmach(){
    int h=0,t=1;
    q[1]=1;point[1]=0;
    while(h<t){
        int now=q[++h];
        for(int i=0;i<=25;i++){
            if(!a[now][i])continue;
            int k=point[now];
            while(!a[k][i])k=point[k];
            point[a[now][i]]=a[k][i];
            q[++t]=a[now][i];
        }
    }
}
void solve(){
    int len=strlen(ch),k=1,ans=0;
    for(int i=0;i<len;i++){
        mark[k]=1;
        int t=ch[i]-a;
        while(!a[k][t])k=point[k];
        k=a[k][t];
        if(mark[k])continue;
        for(int j=k;j;j=point[j]){
            ans+=danger[j];
            danger[j]=0;
        }
    }
    printf("%d\n",ans);
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        memset(a,0,sizeof(a));
        memset(point,0,sizeof(point));
        memset(danger,0,sizeof(danger));
        memset(mark,0,sizeof(mark));
        size=1;
        for(int i=0;i<=25;i++)a[0][i]=1;//为什么要这样预处理 
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",ch);
            insert();
        }
        acmach();
        scanf("%s",ch);
        solve();
    }
    return 0;
}

 

hdu 2222 Keywords Search

标签:targe   for   cstring   赋值   search   net   sea   scan   .net   

原文地址:http://www.cnblogs.com/thmyl/p/8093383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!