AC自动机——HDU2222(题号很鬼畜)Keywords Search

来源:互联网 发布:微信是什么软件 编辑:程序博客网 时间:2024/05/21 02:52

http://acm.hdu.edu.cn/showproblem.php?pid=2222
这道题的算法就是我之前在trie中提到的高深算法——AC自动机!!!
千万不要以为AC自动机就是能使你的程序自动Accepted的东西。。。
具体的算法讲解请看我同学的详细讲解:http://blog.csdn.net/fop_zz/article/details/62418370
这题就是裸的的AC自动机啊
具体做法我同学博客都有,这里放我的代码吧

#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<cstdlib>#include<iostream>using namespace std;char c[1000010];int np=0,b[1000010],p[1000010][27],q[1000010],fail[1000010],sum;inline void insert(){    int now=0,l=strlen(c+1);    for(int i=1;i<=l;i++){        int t=c[i]-'a';        if(!p[now][t])p[now][t]=++np;        now=p[now][t];    }    b[now]++;}inline void bfs(){    int t,l,r;l=r=1;    q[1]=0;    while(l<=r){        t=q[l];int pp=0;l++;        for(int i=0;i<26;i++)if(p[t][i]){            if(t==0)fail[p[t][i]]=0;            else{                pp=fail[t];                while(pp){                    if(p[pp][i]){fail[p[t][i]]=p[pp][i];break;}                    pp=fail[pp];                }                if(!pp){                    if(p[pp][i])fail[p[t][i]]=p[pp][i];                    else fail[p[t][i]]=0;                }            }            q[++r]=p[t][i];        }    }}inline int check(){    int now=0,sum=0,l=strlen(c+1);    for(int i=1;i<=l;i++){        int t=c[i]-'a';        while(!p[now][t]&&now)now=fail[now];        now=p[now][t];        int tt=now;        while(tt&&b[tt]!=-1){            sum+=b[tt];            b[tt]=-1;            tt=fail[tt];        }    }    return sum;}int main(){    int jzq;scanf("%d",&jzq);    while(jzq--){        for(int i=0;i<=np;i++)            for(int j=0;j<26;j++)p[i][j]=0;        for(int i=0;i<=np;i++)fail[i]=b[i]=0;        np=0;        int n;scanf("%d",&n);        for(int i=1;i<=n;i++){            scanf("%s",c+1);            insert();        }        bfs();        scanf("%s",c+1);        int ans=check();        printf("%d\n",ans);    }    return 0;}
2 0
原创粉丝点击