zoukankan      html  css  js  c++  java
  • Keywords Search(hdu 2222)

    题意:给出n个单词,一篇文章,询问有几个单词在文章中出现过。

    /*
      AC自动机的裸题。
      题目标号牛的一比。 
    */
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #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];//类似于kmp的失败数组 
                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
    ",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;
    }
  • 相关阅读:
    秀秀我的PENTAX的手动标头
    软件测试工具
    071226 冷
    071228晴转雨
    长假计划
    Merry Christmas
    信宿事件
    並べ替えーーバブルソート等
    收藏
    实践浪漫
  • 原文地址:https://www.cnblogs.com/harden/p/6247483.html
Copyright © 2011-2022 走看看