HDU 2222 Keywords Search(AC自动机)

来源:互联网 发布:无用神力兄弟会 知乎 编辑:程序博客网 时间:2024/06/09 23:06

自动机入门题

#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector>#include<cstdlib>#define lson (rt<<1),L,M#define rson (rt<<1|1),M+1,R#define M ((L+R)>>1)#define cl(a,b) memset(a,b,sizeof(a));#define LL long long#define P pair<int,int>#define X first#define Y second#define pb push_back#define fread(zcc)  freopen(zcc,"r",stdin)#define fwrite(zcc) freopen(zcc,"w",stdout)using namespace std;const int maxn=6000005;const int inf=1<<28;struct Tire{    int next[maxn][26],fail[maxn],end[maxn];    int root,L;    int newnode(){        for(int i=0;i<26;i++){            next[L][i]=-1;        }        end[L]=0;        return L++;    }    void init(){        L=0;        root=newnode();    }    void insert(char buf[],int val){        int len=strlen(buf);        int now=root;        for(int i=0;i<len;i++){            if(next[now][buf[i]-'a']==-1)                next[now][buf[i]-'a']=newnode();            now=next[now][buf[i]-'a'];        }        end[now]++;    }    void build(){        queue<int> q;        fail[root]=root;        for(int i=0;i<26;i++){            if(next[root][i]==-1)                next[root][i]=root;            else {                fail[next[root][i]]=root;                q.push(next[root][i]);            }        }        while(!q.empty()){            int now=q.front();q.pop();            for(int i=0;i<26;i++){                if(next[now][i]==-1)                    next[now][i]=next[fail[now]][i];                else {                    fail[next[now][i]]=next[fail[now]][i];                    q.push(next[now][i]);                }            }        }    }    int query(char buf[]){        build();        int len=strlen(buf);        int ans=0;        int now=root;        for(int i=0;i<len;i++){            now=next[now][buf[i]-'a'];            int tmp=now;            while(tmp!=root){                ans+=end[tmp];                end[tmp]=0;                tmp=fail[tmp];            }        }        return ans;    }}ac;char s[maxn];int main(){    int T;    scanf("%d",&T);    while(T--){        ac.init();        int n;        scanf("%d",&n);        for(int i=0;i<n;i++){            scanf("%s",s);            ac.insert(s,1);        }        scanf("%s",s);        printf("%d\n",ac.query(s));    }    return 0;}
0 0