hdu2222&hdu3065 AC自动机模板题

来源:互联网 发布:淘宝大学电商运营pdf 编辑:程序博客网 时间:2024/06/02 08:25

不贴链接了
裸题 主要想练习模板
hdu2222:求目标串中出现了几个模式串。(不重复)
hdu3065:求目标串中出现了几个模式串。(可重复)
hdu2222:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>using namespace std;const int N=1000005;const int M=500005;struct AhoCorasick{    int f[N],cnt[N];    int ch[M][26];    int sz,ans;    queue<int>q;    void init(){        sz=0;ans=0;        memset(f,0,sizeof(f));        memset(ch,0,sizeof(ch));        memset(cnt,0,sizeof(cnt));    }    int idx(char c){return c-'a';}    void insert(char *ss){        int u=0;        for(int i=0;ss[i];i++){            int c=idx(ss[i]);            if(!ch[u][c]) ch[u][c]=++sz;            u=ch[u][c];        }        cnt[u]++;    }    void getfail(){        for(int i=0;i<26;i++)            if(ch[0][i]) q.push(ch[0][i]);        while(!q.empty()){            int r=q.front();q.pop();            for(int i=0;i<26;i++){                int u=ch[r][i];                if(!u){ch[r][i]=ch[f[r]][i];continue;}                q.push(u);                int v=f[r];                while(v && !ch[v][i]) v=f[v];                f[u]=ch[v][i];            }        }    }    void find(char *s){        int j=0;        for(int i=0;s[i];i++){            int c=idx(s[i]);            j=ch[j][c];            int now=j;            while(now!=0){                ans+=cnt[now];                cnt[now]=0;                now=f[now];            }        }    }    void print(){printf("%d\n",ans);}    void debug(){        //for(int i=0;i<=sz;i++) printf("%d\n",cnt[i]);    }};AhoCorasick ac;int T;char s[N];int main(){    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);    scanf("%d",&T);    while(T--){        int n;        scanf("%d\n",&n);        ac.init();        char ss[100];        for(int i=1;i<=n;i++)            scanf("%s\n",ss),ac.insert(ss);        ac.getfail();        scanf("%s\n",s);        ac.debug();        ac.find(s);        ac.print();    }    return 0;}

hdu3065

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<map>using namespace std;const int N=1005,L=55,M=2000005;char a[N][L],x[M];struct AhoCorasick{    int f[N*L],last[N*L],val[N*L];    int ch[N*L][128];    int sz;    map<string,int>ans;    void init(){        memset(f,0,sizeof(f));        memset(last,0,sizeof(last));        memset(ch,0,sizeof(ch));        memset(val,0,sizeof(val));        ans.clear();        sz=0;    }    void insert(char *s,int k){        int u=0;        for(int i=0;s[i];i++){            int c=s[i];            if(!ch[u][c]) ch[u][c]=++sz;            u=ch[u][c];        }        val[u]=k;    }    void getfail(){        queue<int>q;        for(int i=0;i<128;i++)            if(ch[0][i]) q.push(ch[0][i]);        while(!q.empty()){            int r=q.front();q.pop();            for(int i=0;i<128;i++){                int u=ch[r][i];                if(!u){ch[r][i]=ch[f[r]][i];continue;}                q.push(u);                int v=f[r];                while(v && !ch[v][i]) v=f[v];                f[u]=ch[v][i];                last[u]=val[f[u]]?f[u]:last[f[u]];            }        }    }    void find(char *s){        int j=0;        for(int i=0;s[i];i++){            int c=s[i];            j=ch[j][c];            int now=j;            while(now!=0){                if(val[now])                    ans[(string)a[val[now]]]++;                now=last[now];            }        }    }    void print(int n){        for(int i=1;i<=n;i++)            if(ans[(string)a[i]]) printf("%s: %d\n",a[i],ans[(string)a[i]]);    }};AhoCorasick ac;int n;int main(){    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);    while(~scanf("%d\n",&n)){        ac.init();        for(int i=1;i<=n;i++) {            scanf("%s\n",a[i]);            ac.insert(a[i],i);        }        ac.getfail();        scanf("%s\n",x);        ac.find(x);        ac.print(n);    }    return 0;}
0 0