hdu2222 ac自动机模板

来源:互联网 发布:细菌发电数据 编辑:程序博客网 时间:2024/06/05 09:51

ac自动机模板题

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<cctype>#include<queue>using namespace std;const int N=1e4+5,L=55,M=1e6+5;struct node{    int cnt,fail,son[26];}tr[N*L];char s[M];int T,tot,n;bool visit[N*L];queue<int>q;void Insert(){    int len=strlen(s),po=1;    for(int i=0;i<len;i++)    {        if(!tr[po].son[s[i]-'a'])            tr[po].son[s[i]-'a']=++tot;        po=tr[po].son[s[i]-'a'];    }    tr[po].cnt++;}void buildfail(){    q.push(1);    while(!q.empty())    {        int u=q.front();        q.pop();        for(int i=0;i<26;i++)        {            int v=tr[u].fail,w;            while(!tr[v].son[i])                v=tr[v].fail;            v=tr[v].son[i],w=tr[u].son[i];            if(w)tr[w].fail=v,q.push(w);            else tr[u].son[i]=v;        }    }}int auto_ac(){    int len=strlen(s),po=1,ans=0,tmp;    for(int i=0;i<len;i++)    {        po=tr[po].son[s[i]-'a'];        tmp=po;        while(tmp&&!visit[tmp])        {            ans+=tr[tmp].cnt;            visit[tmp]=true;            tmp=tr[tmp].fail;        }    }    return ans;}int main(){    //freopen("lx.in","r",stdin);    scanf("%d",&T);    while(T--)    {        memset(tr,0,sizeof(tr));        memset(visit,0,sizeof(visit));        tot=1;        for(int i=0;i<26;i++)tr[0].son[i]=1;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%s",s);            Insert();        }        buildfail();        scanf("%s",s);        cout<<auto_ac()<<endl;    }    return 0;}
原创粉丝点击