zoukankan      html  css  js  c++  java
  • hdu2896 Ac自动机

    ac自动机
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,ans,id[505],vis[105000];
    char s[255],T[10005];
    struct node{
        int a[105000][128],fail[105000],danger[105000],sum,q[105000];
        void insert(int x){
            int k=0,L=strlen(s);
            for(int i=0;i<L;i++){
                int now=s[i];
                if(!a[k][now]) a[k][now]=++sum;
                k=a[k][now];
            }
            danger[k]++;
            id[x]=k;
        }
        void get_fail(){
            int head=0,tail=0;
            for(int i=0;i<128;i++){
                int now=a[0][i];
                if(now) q[tail++]=now;
            }
            while(head!=tail){
                int x=q[head++];
                for(int i=0;i<128;i++){
                    int now=a[x][i];
                    if(!now){a[x][i]=a[fail[x]][i]; continue;}
                    q[tail++]=now;
                    fail[now]=a[fail[x]][i];
                }
            }
        }
        void push_ans(int x){
            int L=strlen(T),k=0,f=0;
            memset(vis,0,sizeof(vis));
            for(int i=0;i<L;i++){
                int now=T[i];
                k=a[k][now];
                for(int j=k;j;j=fail[j]) if(danger[j]){vis[j]=1; f=1;}
            }
            if(!f) return ;
            ans++; printf("web %d:",x);
            for(int i=1;i<=n;i++) if(vis[id[i]]) printf(" %d",i); printf("
    ");
        }
    }node;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%s",s),node.insert(i);
        node.get_fail(); scanf("%d",&m);
        for(int i=1;i<=m;i++) scanf("%s",T),node.push_ans(i);
        printf("total: %d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    MUTC2013 E-Deque-hdu 4604
    MUTC7 C
    MUTC7 A-As long as Binbin loves Sangsang
    MUTC2013 J-I-number-hdu4608
    MUTC2013 H-Park Visit-hdu4607
    判断点是否在多边形内 扫描法
    蓝桥杯 基础练习 十六进制转八进制
    判断点是否在三角形内
    判断点在线段上
    向量的叉乘
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/6914458.html
Copyright © 2011-2022 走看看