zoukankan      html  css  js  c++  java
  • HDU2896 病毒侵袭

    题目传送门

    AC自动机第一题~

    一看就是一个非常简单的多串匹配问题了,输出方案?记录一下就好了

    注意这里code是Trie图,它是AC自动机的改进版本,有效利用了原本无用的边,这反而简化了代码

    #include<queue>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 100010
    using namespace std;
    char s[N];
    int fail[N],son[N][128],c[N],cnt=1,n,T=0;
    inline void insert(char* s,int pos){
        int x=1;
        for(;*s;++s)
            x=son[x][*s]?son[x][*s]:son[x][*s]=++cnt;
        c[x]=pos;
    }
    inline void build(){
        queue<int> q;
        for(int i=0;i<128;++i)
            if(!son[1][i]) son[1][i]=1;
            else q.push(son[1][i]),fail[son[1][i]]=1;
        for(int x;!q.empty();q.pop()){
            x=q.front();
            for(int i=0;i<128;++i)
                if(!son[x][i]) son[x][i]=son[fail[x]][i];
            else q.push(son[x][i]),fail[son[x][i]]=son[fail[x]][i];
        }
    }
    inline bool query(char* s){
        bool vis[510]={0},v=0;
        for(int x=1;*s;++s){
            x=son[x][*s];
            for(int j=x;j!=1;j=fail[j])
                if(c[j]) vis[c[j]]=v=1;
        }
        if(!v) return 0;
        printf("web %d:",T);
        for(int i=1;i<=n;++i) 
            if(vis[i]) printf(" %d",i);
        puts(""); return 1;
    }
    int __18520(){
        if(scanf("%d",&n)<0) return 0; 
        for(int i=1;i<=n;++i){
            scanf("%s",s); insert(s,i);
        }
        build(); int ans=0,m; scanf("%d",&m); 
        for(T=1;T<=m;++T){
            scanf("%s",s); ans+=query(s);
        }
        printf("total: %d
    ",ans); return cnt=1;
    }
    int main(){ while(__18520()); }

  • 相关阅读:
    updatepanel,linkbutton一点问题
    URL编码处理
    习惯
    style.display,有点问题
    [转]Atlas goes M2.2 or June CTP
    贴代码——从泛型数组中递归删除不符合要求的项
    做好项目,思想要不得
    关于MemoryStream类
    DateTimePicker控件的使用
    Console“自服务”读取文件
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/8312614.html
Copyright © 2011-2022 走看看