AC自动机模板

来源:互联网 发布:哪呢儿软件下载 编辑:程序博客网 时间:2024/06/11 01:39
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <queue>#include<ctime>#define N 10000090using namespace std;int n;int date[5000500][26],fail[N],cnt[N],tot=0,ans=0;int st,pt;char str[N],ptr[N];queue<int> q;void build(){    for(int i=0;i<26;i++)        if(date[0][i])           q.push(date[0][i]);    while(!q.empty())    {        int re=q.front();q.pop();        for(int i=0;i<26;i++)        {            if(!date[re][i])            {                date[re][i]=date[fail[re]][i];//直接跳转避免while                continue;            }            q.push(date[re][i]);            fail[date[re][i]]=date[fail[re]][i];        }    }}int main(){    double a=clock();    freopen("in.in","r",stdin);    freopen("my.out","w",stdout);    scanf("%d",&n);    while(n--)    {        scanf("%s",str+1);st=strlen(str+1);        int j=0;        for(int i=1;i<=st;i++)        {            if(!date[j][str[i]-'a']) date[j][str[i]-'a']=++tot;            j=date[j][str[i]-'a'];        }        cnt[j]++;    }    build();    scanf("%s",ptr+1);pt=strlen(ptr+1);    int j=0;    for(int i=1;i<=pt;i++)    {        j=date[j][ptr[i]-'a'];        for(int t=j; t && cnt[t]!=-1;t=fail[t])        {            ans+=cnt[t];cnt[t]=-1;        }    }    cout<<ans<<endl;    cout<<clock()-a<<endl;    return 0;}

原创粉丝点击