zoukankan      html  css  js  c++  java
  • [HDU2222]Keywords Search(AC自动机)

    [不稳定的传送门]

    Solution

    真的是模版

    Code

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define N 500010
    using namespace std;
     
    char s[N*2];
    int n,cas,T[N][27],fail[N],q[N],tot,h,t,num[N];
     
    inline void Insert(){
        scanf("%s",s);
        int len=strlen(s),now=1;
        for(int i=0;i<len;++i){
            if(!T[now][s[i]-96]) T[now][s[i]-96]=++tot;
            now=T[now][s[i]-96];
        }
        num[now]++;
    }
     
    inline void getfail(){
        int k,now;
        for(int i=1;i<=26;++i) T[0][i]=1;
        h=0,t=1;q[1]=1;
        while(h<t){
            now=q[++h];
            for(int i=1;i<=26;++i)
                if(T[now][i]){
                    k=fail[now];
                    while(!T[k][i]) k=fail[k];
                    fail[q[++t]=T[now][i]]=T[k][i];
                }else T[now][i]=T[fail[now]][i];
        }
    }
    
    inline void Init(){
        memset(T,0,sizeof(T));
        memset(fail,0,sizeof(fail));
        memset(num,0,sizeof(num));
        tot=1;
    }
     
    int calc(){
        scanf("%s",s);
        int len=strlen(s),now=1,res=0;
        for(int i=0;i<len;++i){
            now=T[now][s[i]-96];
            int tmp=now;
            while(tmp){
                res+=num[tmp];
                num[tmp]=0;
                tmp=fail[tmp];
            }
        }
        return res;
    } 
    
    int main(){
        scanf("%d",&cas);
        while(cas--){
            Init();
            scanf("%d",&n);
            for(int i=1;i<=n;++i) Insert();
            getfail();
            printf("%d
    ",calc());
        }
        return 0;
    }
    
  • 相关阅读:
    day60----日考
    css之单位
    如何装双系统win10下装Ubuntu
    css之Grid Layout详解
    css之position详解
    html+css的用户注册界面
    self-introduction
    ps常用操作
    前端基础之BOM和DOM
    emment语法
  • 原文地址:https://www.cnblogs.com/void-f/p/8942090.html
Copyright © 2011-2022 走看看