Hdu2222Keywords Search

来源:互联网 发布:路亚竿能钓什么鱼 知乎 编辑:程序博客网 时间:2024/06/16 19:14

Hdu2222

存一发AC自动机模板…

【代码】

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#define N 500005#define INF 1LL<<60using namespace std;typedef long long ll;ll read(){    ll x=0,f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}    return x*f;}int T,n,cnt;int g[N][26],Next[N],tag[N];bool Flag[N];void Clear(int x){    Next[x]=tag[x]=0;    memset(g[x],0,sizeof(g[x]));}void Add(char *s){    int len=strlen(s);    int now=0;    for(int i=0;i<len;i++)    {        if(!g[now][s[i]-'a']) {            Clear(++cnt);            g[now][s[i]-'a']=cnt;        }        now=g[now][s[i]-'a'];    }    tag[now]++;}void Input_Init(){    n=read();cnt=0;    Clear(0);    for(int i=1;i<=n;i++)    {        char s[55];        scanf("%s",s);        Add(s);    }}void Construct(){    queue<int>q;    for(int i=0;i<26;i++)    {        int v=g[0][i];        if(v) q.push(v);    }    while(!q.empty())    {        int k=q.front();q.pop();        for(int i=0;i<26;i++)        {            int &v=g[k][i];            if(v)             {                q.push(v);                Next[v]=k==0?0:g[Next[k]][i];            }            else v=k==0?0:g[Next[k]][i];        }    }}void Solve(){    char ch[1000005];int ans=0;    scanf("%s",ch);    int len=strlen(ch);    for(int i=0,j=0;i<len;i++)    {        int v=g[j][ch[i]-'a'];        while(!v&&j)         {            j=Next[j];            v=g[j][ch[i]-'a'];        }        j=v;        while(v&&tag[v]!=-1)        {            ans+=tag[v];            tag[v]=-1;            v=Next[v];        }    }    printf("%d\n",ans);}int main(){    T=read();    while(T--)    {        Input_Init();        Construct();        Solve();    }    return 0;}
0 0