hdu 2222 Keywords Search

本文介绍了一种使用AC自动机实现关键词搜索的方法。通过构建AC自动机,可以在给定的句子中高效地查找多个关键词的出现次数。文章详细解释了AC自动机的构建过程及其在关键词搜索中的应用。

Keywords Search

 HDU - 2222 

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

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 500010
#define M 1000010
using namespace std;
int a[N][26],word[N],fail[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];
    }
    word[now]++;
}
void acmach(){
    int h=0,t=1;
    q[1]=1;fail[1]=0;
    while(h<t){
        int now=q[++h];
        for(int i=0;i<=25;i++){
            if(!a[now][i])continue;
            int k=fail[now];
            while(!a[k][i])
                k=fail[k];
            fail[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=fail[k];
        k=a[k][t];
        if(mark[k])continue;
        for(int j=k;j;j=fail[j]){
            ans+=word[j];
            word[j]=0;
        }
    }
    printf("%d\n",ans);
}
int main(){
    freopen("Cola.txt","r",stdin);
    int T;scanf("%d",&T);
    while(T--){
        memset(a,0,sizeof(a));
        memset(fail,0,sizeof(fail));
        memset(word,0,sizeof(word));
        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;
}

 

转载于:https://www.cnblogs.com/thmyl/p/8093383.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值