hdu2896

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("\n");
    }
}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\n",ans);
    return 0;
}

时间: 2024-10-18 21:20:41

hdu2896的相关文章

【HDU2896】病毒侵袭 AC自动机

[HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒.小t不幸成为受害者之一.小t如此生气,他决定要把世界上所有带病毒的网站都找出来.当然,谁都知道这是不可能的.小t却执意要完成这不能的任务,他说:"子子孙孙无穷匮也!"(愚

hdu2896 病毒侵袭 AC自动机入门题 N(N &lt;= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M &lt;= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串, 题目保证每个待匹配串中最多有三个模式串. 思路:ac自动机做法,字符为可见字符,那么直接就是他们的ascii值作为每一个字符的标志.最多128: 由于不超过三个,所以找到3个就可以re

HDU-2896 病毒侵袭 字符串问题 AC自动机

题目链接:https://cn.vjudge.net/problem/HDU-2896 题意 中文题 给一些关键词和一个字符串,问字符串里包括了那几种关键词 思路 直接套模版 改insert方法,维护一个itemCounter,给关键词计数 改query方法,统计counter即可 提交过程 AC 代码 #include<iostream> #include<cstdio> #include<queue> #include<cstring> using na

HDU2896病毒侵袭(ac自动机)

网上很多代码都略显繁琐,看了一下yy dalao的代码感觉很好,但他懒得打题解(好吧我也是 以0为根节点的话,我把yy的一段代码删了改用fail[c]=x==0?0:ch[fail[x]][i];来实现特判,效果还不错! 也算是AC自动机的模版题吧,用了一个id数组来储藏每一个特征码的最后一个字符所在位置,再用vis来看网站源码中有哪条特征码(即哪条特征码的id被访问到 #include<cstdio> #include<cstring> using namespace std;

hdu2896 AC自动机

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11422    Accepted Submission(s): 2957 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿

hdu2896 病毒侵袭 ac自动机

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23013    Accepted Submission(s): 5551 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大

病毒侵袭---hdu2896(AC自动机)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 输入的字符是所有可见的ASCII码(共有127个)所以要注意一下: 把结果存到一个数组中,然后输出: 要用c++交,G++会MLE的: #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; const int N = 1e4

HDU2896 病毒侵袭【AC自动机】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意: 给你N个模式串(编号为1~N).接下来给你M个主串.问:主串中出现的模式串的编号. 思路: 和HDU2222一样.都是求文本串(主串)中出现的模式串.不同的是这道题要求输出的是模式 串的编号.用Val[]来保存模式串的编号id.同时注意字符为ASCII码可见字符,即32~127共 95个.其实定义95就可以了,我这里定义了128,不过没什么影响. AC代码: #include<i

HDU-2896

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13776    Accepted Submission(s): 3545 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿