HDU 2896 病毒侵袭(AC自动机)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

题意:

给定几个模式串,看是否出现在主串中,如果出现在主串,输出这些模式串的标号。

解析:

AC自动机裸题。
用所给的模式串构建AC自动机,然后用主串去匹配。
将匹配到的结果插入set中,最后输出set。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
const int maxnode = 501 * 201;
const int sigma_size = 127 - 31;
const int MAXN = 205;

set<int> ans;
set<int>::iterator it;

struct AC {
    int ch[maxnode][sigma_size];
    int fail[maxnode];
    int last[maxnode];
    int val[maxnode];
    int sz;

    void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }

    inline int idx(char c) { return c - 31; }

    void insert(char* s, int v = 1) {
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++) {
            int c = idx(s[i]);
            if(!ch[u][c]) {
                memset(ch[sz], 0, sizeof(ch[sz]));
                val[sz] = 0;
                ch[u][c] = sz++;
            }
            u = ch[u][c];
        }
        val[u] = v;
    }

    void getFail() {
        queue<int> que;
        fail[0] = 0;
        for(int c = 0; c < sigma_size; c++) {
            int u = ch[0][c];
            if(u) { fail[u] = last[u] = 0; que.push(u); }
        }

        while(!que.empty()) {
            int r = que.front(); que.pop();
            for(int c = 0; c < sigma_size; c++) {
                int u = ch[r][c];
                if(!u) continue;
                que.push(u);

                int v = fail[r];
                while(v && !ch[v][c]) v = fail[v];
                fail[u] = ch[v][c];
                last[u] = val[fail[u]] ? fail[u] : last[fail[u]];
            }
        }
    }

    void find(char *s) {
        int n = strlen(s);
        int v = 0;
        ans.clear();
        for(int i = 0; i < n; i++) {
            int c = idx(s[i]);

            while(v && !ch[v][c]) v = fail[v];
            v = ch[v][c];

            if(val[v]) print(v);
            else if(last[v]) print(last[v]);
        }
    }

    void print(int u) {
        while(u) {
            ans.insert(val[u]);
            u = last[u];
        }
    }
} ac;

char key[MAXN];
char tar[10005];
int n, m;

int main() {
    while(~scanf("%d", &n)) {
        ac.clear();
        for(int i = 1; i <= n; i++) {
            scanf("%s", key);
            ac.insert(key, i);
        }
        ac.getFail();

        scanf("%d", &m);
        int tot = 0;
        for(int i = 1; i <= m; i++) {
            scanf("%s", tar);
            ac.find(tar);
            if(ans.size() > 0) {
                tot++;
                printf("web %d:", i);
                for(it = ans.begin(); it != ans.end(); it++)
                    printf(" %d", *it);
                puts("");
            }
        }
        printf("total: %d\n", tot);
    }
    return 0;
}
Hdu 2896 病毒侵袭 AC自动机 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 26485    Accepted Submission(s): 6210 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光 阅读详情

相关推荐

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 601

HDU 2896 (AC自动机模板题)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串。多个匹配串。其中串的字符范围是(0~127)。问匹配串中含有哪几个模式串。 解题思路: AC自动机模板题。注意一下字符范围。 cnt记录这个模式串的个数改为这个模式串的index。 find的时候,把找到的index压入vector里面即可。 注意有多个匹配串...

weixin_34273479的博客 187

利用PV操作控制进程的并发进行---经典题解

前趋图 先理清楚前趋图中的逻辑关系:P1没有前驱,P2的前驱是P1,P3的前驱是P1、P2,P4的前驱是P2,P5的前驱是P3、P4。 前驱就是指只有在前驱进程完成后,该进程才能开始执行。由图可知,这里进程之间有6条有向弧,分别表示为P1→P2,P1→P3,P2→P3,P2→P4,P3→P5,P4→P5, 各个进程间的逻辑关系,那么我们需要设定6个信号量(S1、S2、S3、S4、S5、S6),利用PV操作来控制这些过程。 对于第一个空,P1执行完成之后,需要通知P2、P3可以开始,此处需要V(S

Yan Ka Kue的博客 6113

HDU - 2896 (Aho-Corasick AC自动机)

题目链接 AC自动机:先根据若干子串创造一颗字典树,再通过BFS构建fail指针,最后查询。 首先普通字典树的建立。 void add() { char s[200+10]; scanf("%s", s); int rt = 0, len = strlen(s); for(int i = 0; i < len; i ++) { int now = s[i]; if(tr...

ttoobne 327

HDU2896 - 病毒入侵 - AC自动机

病毒侵袭 题目链接 分类:data structures strings 1.题意概述 给你N(1<=N<=500)个模式串,M(1<=M<=1000)个待匹配串,查询这M个串每个串中模式串出现过哪几个,和总的出现次数。 2.解题思路 也是裸的AC自动机,因为是有查询几次,为了方便输出,我们插入同时维护记录一下插入的每个模式串的id和次数。 3.AC代码class Trie { pub

终有绿洲摇曳在沙漠 413

HDU - 2896 病毒侵袭 AC自动机

题目链接:https://vjudge.net/problem/HDU-2896 题意: Input 第一行,一个整数N(1<=N<=500),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在20—200之间。 每个病毒都有一个编号,依此为1—N。 不同编号的病毒特征码不会相同。 在这之后一行,有一个整数M(1<=M<=1000)...

还我笑颜 280

hdu 2896 病毒侵袭 //AC自动机

<br /> <br />病毒侵袭Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)<br />Total Submission(s): 1621    Accepted Submission(s): 423<br /><br /><br />Problem Description当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有

hqd_acm的专栏 1698

hdu 2896 病毒侵袭 ac自动机

1 /* 2 hdu 2896 病毒侵袭 ac自动机 3 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 4 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 。本题中主要是计算每一个模式串 5 在主串中有没有出现过,而不是计算出现过多少次,所以将last[]数组省掉.... 6 */ ...

aipiannian6725的博客 207

AC自动机(2)--hdu2896(病毒侵袭)(基础题)

病毒侵袭             Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u Description

Sly_461的博客 826

hdu 2896 病毒侵袭(ac自动机)

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

weixin_30251587的博客 88

HDU 2896 病毒侵袭 AC自动机裸题

题目来源:HDU 2896 病毒侵袭 题意:求文本串中有多少个模式串 并且输出下标 思路:直接ac自动机 然后数组记录在输出 我日写了半天结果函数没调用 找了半天错误 你要长记性啊 这种错误犯了好几次了啊 笨蛋 #include #include #include using namespace std; const int maxn = 10010; char a[maxn];

嗯。 988

HDU 2896 病毒侵袭(AC自动机)

HDU 2896 病毒侵袭(AC自动机) 题意:给你一组模板,然后在给你多个文本,要你去匹配文本,看看每个文本中都出现了哪些模板然后输出即可. 分析:本题的模板不会重复,题目中已说明.        不过本题的字符是所有ASCII码可见字符,所以sigma_size=128. AC代码:

code 1157

hdu 2896 病毒侵袭 (AC自动机)

hdu 2896 病毒侵袭 基础AC自动机

yjCola 523

HDU2896.病毒侵袭中【MLE和PE的原因】【AC自动机模板题】

HDU#2896.病毒侵袭中(重点:MLE和PE)AC自动机题目飞机票 其他AC自动机练习题目(谢谢kuangbin的题目) AC自动机题解网上的题解已经很清楚了,我也不再赘述╰(´︶`)╯ 给你几个串还有几个模式串,问每一个模式串的匹配数量和总的匹配数量 一个AC自动机的版题,为什么要发个BlogBlog也是为了给大家说一声: 如果你写的PE了,很简单,web后面的输出行末不能有空格,先f

snowMyDream's BLOG 1457

AC自动机HDU - 2896 病毒侵袭(字典树应该开多大的数组???)

无所谓 慢慢来 迷宫一样的未来

L_X_ 334

病毒侵袭 HDU - 2896AC自动机

思路:在建树的时候吧每个病毒的编号加进去,在match的时候找到对应的值,因为最多3个病毒,所以找到3个直接退出。 #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include<iostream> #include<vector> #include<queue> //#include<bits/stdc++.h&g..

Ray.C.L的博客 388

HDU2896 病毒侵袭 AC自动机

题目大意:给出n个病毒和n个网站,找出每一个网站中含有的病毒种类,并按病毒编号升序输出,最后统计含有病毒的网站个数。 分析:比较裸的AC自动机的题,我们可以在构造tire树的过程中顺便把编号插入,然后询问时纪录病毒个数的同时用一个数组纪录病毒的编号,然后排序输出即可(WA若干次才发现忘把病毒按编号排序后再输出了)。还有就是本题空间卡的很死,你要是按题意(每一个字符都是课件的ASC2可见代

AC_Gibson的专栏 2019

HDU 2896 病毒侵袭AC自动机

http://acm.hdu.edu.cn/showproblem.php?pid=2896HDU 2896 病毒侵袭大意:有n种病毒,编码已知。有m个网站源码,求带病毒的网站个数以及其对应的病毒Sample Input3aaabbbccc2aaabbbcccbbaacc Sample Outputweb 1: 1 2 3total: 1 hint:有3种病毒,编码分别为aaabb...

a48634331的博客 117

HDU2222 Keywords Search + HDU2896病毒侵袭 AC自动机

虽然看明白了KMP和字典树,但是AC自动机还是没怎么理解QAQ... 附上讲解博客Orz:https://blog.csdn.net/qq_30346729/article/details/78835040                                https://www.cnblogs.com/cjyyb/p/7196308.html 1.HDU2222 Keyword...

A confused programmer 297
上一篇: hdu 3037 Saving Beans(lucas定理模板)
下一篇: hdu 3016 Man Down(线段树区间更新+dp)
HelloWorld10086
博客等级 码龄12年 88粉丝 614原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值