HDU2222: Keywords Search AC自动机

来源:互联网 发布:抢小米3软件 编辑:程序博客网 时间:2024/05/18 03:19

挂一个模板题QAQ(其实是我忘了AC自动机怎么写了)

#include<bits/stdc++.h>#define N 500005using namespace std;int T,n,cnt,ans,a[N][27],sum[N],p[N],q[N];bool v[N];char s[N<<1],ss[55];inline void insert(){    scanf("%s",ss);    int x=1,c,l=strlen(ss);    for (int i=0;i<l;i++)    {        c=ss[i]-'a'+1;        if (a[x][c]) x=a[x][c]; else x=a[x][c]=++cnt;    }    sum[x]++;}inline void build_fail(){    int t=0,w=1,x;    q[1]=1; p[1]=0;    while (t<w)    {        x=q[++t];        for (int i=1;i<=26;i++)            if (a[x][i])            {                int k=p[x];                while (!a[k][i]) k=p[k];                p[a[x][i]]=a[k][i];                q[++w]=a[x][i];            }    }}inline void Ac_machine(){    scanf("%s",s);    int x=1,c,l=strlen(s);    for (int i=0;i<l;i++)    {        c=s[i]-'a'+1;        v[x]=1;        while (!a[x][c]) x=p[x];        x=a[x][c];        if (!v[x])            for (int j=x;j;j=p[j]) ans+=sum[j],sum[j]=0;    }}int main(){    scanf("%d",&T);    while (T--)    {        scanf("%d",&n);        cnt=1; ans=0;        for (int i=1;i<=26;i++) a[0][i]=1;        for (int i=1;i<=n;i++) insert();        build_fail();        Ac_machine();        printf("%d\n",ans);        for (int i=1;i<=cnt;i++)        {            p[i]=sum[i]=v[i]=0;            for (int j=1;j<=26;j++) a[i][j]=0;        }    }    return 0;}
0 0
原创粉丝点击