[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\n",calc());
    }
    return 0;
}

 

posted @ 2018-04-25 11:44  void_f  阅读(209)  评论(0编辑  收藏  举报