hdu 2222 ac自动机

来源:互联网 发布:linux编程实践教程 编辑:程序博客网 时间:2024/05/27 20:32

好不容易敲好模板好吗,TM还有trick。。。。。查了好几遍代码!!!!!相同字符串按不同处理。。。。。果然这题够222222

#include<cstdio>#include<stdlib.h>#include<string.h>#include<string>#include<cmath>#include<cstring>#include<algorithm>#include<map>#include<set>#include<queue>#include<vector>using namespace std;#define maxno 1000000#define size 26char s[1000009];int ch[maxno][size];int val[maxno];int last[maxno];int f[maxno];int sz;int ans;map<int,int> m;void clea(){        memset(ch[0],0,sizeof(ch[0]));        sz=1;}int idx(char x){return x-'a';}void insert(char *s){        int n=strlen(s);        int u=0;        for(int i=0;i<n;i++)        {            int c=idx(s[i]);            if(!ch[u][c])            {                memset(ch[sz],0,sizeof(ch[sz]));                val[sz]=0;                ch[u][c]=sz++;            }            u=ch[u][c];        }        val[u]++;}void getfail(){     queue<int> q;     f[0]=0;     for(int i=0;i<size;i++){        if(ch[0][i])        {            q.push(ch[0][i]);            f[ch[0][i]]=0;            last[ch[0][i]]=0;        }     }     while(!q.empty())     {         int r=q.front();         q.pop();         for(int i=0;i<size;i++)         {             int u=ch[r][i];             if(!u)                continue;             q.push(u);             f[u]=0;             last[u]=0;             int v=f[r];             while(v&&!ch[v][i])                v=f[v];             f[u]=ch[v][i];             if(val[f[u]])                last[u]=f[u];             else                last[u]=last[f[u]];         }     }}void print(int j){    if(!m[j]&&j)    {        ans+=val[j];        m[j]=1;        print(last[j]);    }}void find(){    int n=strlen(s);    int j=0; //   int u=0;    for(int i=0;i<n;i++)    {        int c=idx(s[i]);        while(j&&!ch[j][c])            j=f[j];        j=ch[j][c];        if(val[j])            print(j);        else if(last[j])            print(last[j]);    }}int main(){//    freopen("in.txt","r",stdin);//    freopen("out.txt","w",stdout);    int t,n;    char s1[55];    scanf("%d",&t);    while(t--)    {   clea();        ans=0;        m.clear();        //memset(f,0,sizeof(f));       // memset(last,0,sizeof(last));        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%s",s1);            insert(s1);        }        scanf("%s",s);        getfail();        find();        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击