hdoj 2896 病毒侵袭(AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896
思路分析:题目为模式匹配问题,对于一个给定的字符串,判断能匹配多少个模式;该问题需要静态建树,另外需要对AC自动机的模板加以修改,
对于每个匹配的模式的最后一个单词的fail指针指向root,即可实现一个字符串进行多次模式匹配;
代码如下:
- #include <queue>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int KIND = ;
- const int MAX_NODE = * ;
- const int MAX_M = + ;
- char str[MAX_M];
- int vir_match[MAX_M];
- struct Trie {
- int root, count;
- int next[MAX_NODE][KIND], fail[MAX_NODE], end[MAX_NODE];
- void Init()
- {
- count = ;
- root = NewNode();
- }
- int NewNode()
- {
- for (int i = ; i < KIND; ++i)
- next[count][i] = -;
- end[count] = -;
- return count++;
- }
- void Insert(char *str, int id)
- {
- int i = , k = ;
- int now = root;
- while (str[i])
- {
- k = str[i];
- if (next[now][k] == -)
- next[now][k] = NewNode();
- now = next[now][k];
- ++i;
- }
- end[now] = id;
- }
- void BuildAutomaton()
- {
- queue<int> Q;
- fail[root] = -;
- Q.push(root);
- while (!Q.empty())
- {
- int now = Q.front();
- int p = -;
- Q.pop();
- if (end[now] != -)
- fail[now] = root;
- for (int i = ; i < KIND; ++i)
- {
- if (next[now][i] != -)
- {
- if (now == root)
- fail[next[now][i]] = root;
- else
- {
- p = fail[now];
- while (p != -)
- {
- if (next[p][i] != -)
- {
- fail[next[now][i]] = next[p][i];
- break;
- }
- p = fail[p];
- }
- if (p == -)
- fail[next[now][i]] = root;
- }
- Q.push(next[now][i]);
- }
- }
- }
- }
- int Match(char *str)
- {
- int i = , k = , vir_count = ;
- int p = root;
- while (str[i])
- {
- k = str[i];
- while (next[p][k] == - && p != root)
- p = fail[p];
- p = next[p][k];
- p = (p == -) ? root : p;
- if (end[p] != -)
- {
- vir_match[vir_count++] = end[p];
- p = fail[p];
- }
- ++i;
- }
- return vir_count;
- }
- };
- Trie root;
- int main()
- {
- int vir_num = , web_num = ;
- int match_count = , web_matched = ;
- while (scanf("%d\n", &vir_num) != EOF)
- {
- root.Init();
- for (int i = ; i < vir_num; ++i)
- {
- gets(str);
- root.Insert(str, i + );
- }
- web_matched = ;
- match_count = ;
- root.BuildAutomaton();
- scanf("%d\n", &web_num);
- for (int i = ; i < web_num; ++i)
- {
- int ans = ;
- gets(str);
- ans = root.Match(str);
- sort(vir_match, vir_match + ans);
- if (ans)
- {
- web_matched++;
- printf("web %d: ", i + );
- for (int j = ; j < ans - ; ++j)
- printf("%d ", vir_match[j]);
- printf("%d\n", vir_match[ans - ]);
- }
- }
- printf("total: %d\n", web_matched);
- }
- return ;
- }
hdoj 2896 病毒侵袭(AC自动机)的更多相关文章
- hdu 2896 病毒侵袭 ac自动机
/* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...
- hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2896 病毒侵袭 AC自动机 基础题
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 2896 病毒侵袭 (AC自己主动机)
pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...
- hdu2896 病毒侵袭 ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- 【HDU2896】病毒侵袭 AC自动机
[HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...
- HDu-2896 病毒侵袭,AC自动机模板题!
病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...
- hduoj-----(2896)病毒侵袭(ac自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- pushViewController自定义动画
实现的主要代码如下: CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transiti ...
- 堆分配与栈分配---SAP C++电面(5)/FEI
一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上 ...
- IT工程师值得一看的书籍
http://blog.csdn.net/chinahuyong/article/details/45060203
- hadoop hdfs 一些命令记录
1.列出目录下的对象:hadoop fs -ls /lib 2.统计文件行数:hadoop fs -cat /文件* | wc -l 3.统计文件或者目录大小:hadoop fs -count /l ...
- jQuery实时获取checkbox状态问题
在最近的项目开发中,使用jQuery操作checkbox时,发现一个问题. Html代码如下: <body> <div> <inputtype="checkbo ...
- Use eplipse to develop Python project
Source: This is the example how to use eclipse and python. http://www.360doc.com/content/15/0206/10/ ...
- Android 5.x新特性之elevation(阴影),tinting(着色)以及clipping(剪裁)
快过年了,公司也没事做了, 自己也闲了下来,一天天呆着真没意思,闲来没事自己研究研究了Google I/O 2014 发布 Material Design设计,人性化的风格,丰富的色彩,使人机交互更完 ...
- 使用LAMP创建基于wordpress的个从博客站点
參考: http://blog.csdn.net/ck_boss/article/details/27866117 一.mysql配置 1.安装mysql yum install mysql-serv ...
- 【Oracle】RAC添加新节点
RAC添加节点: 环境: OS:OEL5.6 RAC:10.2.0.1.0 原有rac1,rac2两个节点.如今要添加rac3节点: 操作过程: 改动三个节点上的/etc/hosts文件 192.16 ...
- Apache OFbiz entity engine源代码解读
简单介绍 近期一直在看Apache OFbiz entity engine的源代码.为了能够更透彻得理解,也由于之前没有看人别人写过分析它的文章,所以决定自己来写一篇. 首先,我提出一个问题,假设你有 ...