zoukankan      html  css  js  c++  java
  • HDU 3065 病毒侵袭持续中 AC自动机

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    #define pb(a) push_back(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("d:\in.txt","r",stdin);
       // freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    const int SIGMA_SIZE=128;
    const int MAX_NODE=55000;
    class ACAutomation
    {
    private:
        int sz;
        int ch[MAX_NODE][SIGMA_SIZE];
        int fail[MAX_NODE];
        int val[MAX_NODE];
        int idx(char c){return c;}
    public:
        void init()
        {
            memset(ch,0,sizeof(ch));
            memset(val,0,sizeof(val));
            sz=1;
        }
        void insert(const char *s,int v)
        {
            int u=0;
            for(int i=0;s[i]!='';i++)
            {
                int v=idx(s[i]);
                if(!ch[u][v])ch[u][v]=sz++;
                u=ch[u][v];
            }
            val[u]=v;
        }
        void construct()
        {
            queue<int> q;
            fail[0]=0;
            for(int c=0;c<SIGMA_SIZE;c++)
            {
                int u=ch[0][c];
                if(u){fail[u]=0;q.push(u);}
            }
            while(!q.empty())
            {
                int r=q.front();q.pop();
                for(int c=0;c<SIGMA_SIZE;c++)
                {
                    int& u=ch[r][c];
                    if(!u){u=ch[fail[r]][c];continue;}
                    q.push(u);
                    int v=fail[r];
                    while(v&&!ch[v][c])v=fail[v];
                    fail[u]=ch[v][c];
                }
            }
    
        }
        void count(int u,int *num)
        {
    
                if(val[u])num[val[u]]++;
                if(fail[u])count(fail[u],num);
    
        }
        void find(const char *s,int *num)
        {
            int u=0;
            for(int i=0;s[i]!='';i++)
            {
                int c=idx(s[i]);
                u=ch[u][c];
                if(val[u])count(u,num);
            }
        }
    }ac;
    
    char dic[1100][55];
    char T[2002000];
    int num[1100];
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            ac.init();
            for(int i=1;i<=n;i++)
            {
                scanf("%s",dic[i]);
                ac.insert(dic[i],i);
            }
            scanf("%s",T);
            memset(num,0,sizeof(num));
            ac.construct();
            ac.find(T,num);
            for(int i=1;i<=n;i++)
            {
                if(num[i]>0)
                    printf("%s: %d
    ",dic[i],num[i]);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/BMan/p/3374634.html
Copyright © 2011-2022 走看看