zoukankan      html  css  js  c++  java
  • hdu3065 ac自动机

    傻逼多组测试,想了很久不知道为什么wa,结果是多组测试

    ac自动机很多时候就是对End数组的操作,这题是用End数组记录末尾的字符串,query的时候sum综合一下End数组

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=50000+10,maxn=60000+10,inf=0x3f3f3f;
    
    int sum[1000+10];
    struct Trie{
        int tot,root,End[N];
        int Next[N][95],fail[N];
        int newnode()
        {
            for(int i=0;i<95;i++)
                Next[tot][i]=-1;
            End[tot]=0;
            return tot++;
        }
        void init()
        {
            tot=0;
            root=newnode();
            memset(sum,0,sizeof sum);
        }
        void insertstring(char *s,int k)
        {
            int now=root,len=strlen(s);
            for(int i=0;i<len;i++)
            {
                if(Next[now][s[i]-' ']==-1)
                    Next[now][s[i]-' ']=newnode();
                now=Next[now][s[i]-' '];
            }
            End[now]=k;
        }
        void build()
        {
            queue<int>q;
            fail[root]=root;
            for(int i=0;i<95;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<95;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]);
                    }
                }
            }
        }
        void query(char *s)
        {
            int now=root,len=strlen(s);
            for(int i=0;i<len;i++)
            {
                now=Next[now][s[i]-' '];
                int temp=now;
                while(temp!=root)
                {
                    sum[End[temp]]++;
                    temp=fail[temp];
                }
            }
        }
    };
    Trie ac;
    char a[1000+10][50+10];
    char s[2000000+10];
    int main()
    {
        /*ios::sync_with_stdio(false);
        cin.tie(0);*/
        int n;
        while(~scanf("%d",&n))
        {
            ac.init();
            for(int i=1; i<=n; i++)
            {
                scanf("%s",&a[i]);
                ac.insertstring(a[i],i);
            }
            ac.build();
            getchar();
            char p;
            int cnt=0;
            memset(s,0,sizeof s);
            while((p=getchar())!='
    ')s[cnt++]=p;
            ac.query(s);
            for(int i=1; i<=n; i++)
            {
                if(sum[i]==0)continue;
                printf("%s: %d
    ",a[i],sum[i]);
            }
        }
        return 0;
    }
    /********************
    3
    AA
    BB
    C
    ooxxCC%dA AAoen....END
    ********************/
    View Code
  • 相关阅读:
    python数据类型
    集合(set)内置方法
    python第三天
    剑指offer-什么是1G/2G/3G/4G/5G
    经典交换实验-二层交换机实现pc隔离&vlan通信
    linux运维神器-htop&mtr
    三分钟速学linux-进程管理命令
    三分钟速学文件权限管理
    三分钟速学网卡管理配置-nmcli命令
    三分钟速学linux-centos/redhat常见包管理器
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7553390.html
Copyright © 2011-2022 走看看