[HDU2222]Keywords Search(AC自动机)

Posted void_f

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}

 

以上是关于[HDU2222]Keywords Search(AC自动机)的主要内容,如果未能解决你的问题,请参考以下文章

刷题HDU 2222 Keywords Search

hdu[2222]keywords search

hdu 2222 Keywords Search

HDU - 2222 Keywords Search

hdu 2222 Keywords Search

HDU 2222 - Keywords Search