zoukankan      html  css  js  c++  java
  • [AC自动机][HDU3065]

    //======================
    // HDU 2222
    // 求目标串中出现了几个模式串
    //输入 
    //1
    //5
    //she
    //he
    //say
    //shr
    //her
    //yasherhs 
    //====================
    //这道题如果for一遍把不属于A-Z的变量改成Z+1  反而会超时 直接用next[1000*55][128]搞定算了 
    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<queue>
    char S[1001][51];
    int num[1001];
    using namespace std;
    
    struct Trie
    {
        int next[1000*55][128],fail[1000*55],end[1000*55];
        int root,L;
        int newnode()
        {
            for(int i=0;i<128;i++)
                next[L][i]=-1;
            end[L++]=0;
            return L-1; 
        }
        void init()
        {
            L=0;
            root=newnode();
        } 
        void insert(char buf[],int p)
        {
            int len = strlen(buf);
            int now = root;
            for(int i=0;i<len;i++)
            {
                if(next[now][buf[i]]==-1)
                    next[now][buf[i]]=newnode();
                now=next[now][buf[i]];
            }
            end[now]=p;
        }
        void build()
        {
            queue<int>Q;
            fail[root]=root;
            for(int i=0;i<128;i++)
                if(next[root][i]==-1)
                    next[root][i]=root;                     //匹配失效回到根节点继续匹配 
                else  
                {
                    fail[next[root][i]]=root;               //第一层的失败指针指向root 
                    Q.push(next[root][i]);                  //加入队列    
                }
            while(!Q.empty())
            {
                int now=Q.front();
                Q.pop();
                for(int i=0;i<128;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[])
        {
            int len=strlen(buf);
            int now=root;
            int res=0;
            for(int i=0;i<len;i++)
            { 
                now=next[now][buf[i]];
                int temp=now;
                while(temp!=root)
                {
                    num[end[temp]]++;
                    temp=fail[temp];
                } 
            } 
            return res;
        } 
        void debug()
        {
            for(int i=0;i<L;i++)
            {
                           printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]);
                           for(int j = 0;j <= 26;j++)
                             printf("%2d",next[i][j]);
                           printf("]
    ");
            } 
        } 
    };
        int n;
    char s[300];
    char buff[2000005];
        Trie ac;
    void input()
    {
        memset(S,0,sizeof(S));
        memset(num,0,sizeof(num)); 
        ac.init();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",S[i]);
            ac.insert(S[i],i);
        }
        ac.build();
    }
    int main()
    {
    //  freopen("a.in","r",stdin);
        int T;
        while(cin>>n)
        {
            input();
            scanf("%s",buff);
    
            ac.query(buff);
            for(int i=1;i<=n;i++)
            if(num[i]>0)
            {
                printf("%s: %d
    ",S[i],num[i]); 
            } 
        }
        return 0;
    }
    
    
    
    
    
  • 相关阅读:
    Redis --- 客户端 --- Another Redis Desktop Manager
    Docker --- 记录安装与使用过程中遇到的问题
    Docker安装教程
    Python --- pip --- No module named 'pip'异常问题
    天气接口测试用例生成报告
    jsonpath使用
    python小知识,字典
    python小知识,列表推导式
    python小知识,sort和serted的区别
    如何查看app启动的activity
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480311.html
Copyright © 2011-2022 走看看