HDU 2896 病毒侵袭 (AC自动机)
这题模板题.............但是竟然要去重........调试了半天才发现....................
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; struct trie {
trie *next[128];
int flag;
int num;
trie *fail;
trie() {
fail = NULL;
flag = num = 0;
memset(next,0,sizeof(next));
}
}*q[511111]; trie *rt = new trie();
int vi[555],cnt,head,tail;
char keyword[222];
char book[11111]; void insert(char *key,int num) {
trie *p = rt;
while(*key) {
int t = int(*key);
if(p->next[t] == NULL) p->next[t] = new trie();
p = p->next[t];
key ++;
}
p->flag = 1;
p->num = num;
} void bfs() {
rt->fail = NULL;
head = tail = 0;
q[head++] = rt;
while(head != tail) {
trie *t = q[tail++];
trie *tmp = NULL;
for(int i=0; i<128; i++) {
if(t->next[i] != NULL) {
if(t == rt ) t->next[i]->fail = rt;
else {
tmp = t->fail; //沿着父亲的fail指针走
while(tmp != NULL) {
if(tmp->next[i] != NULL) {
t->next[i]->fail = tmp->next[i];
break;
}
tmp = tmp->fail;
}
if(tmp == NULL) t->next[i]->fail = rt;
}
q[head++] = t->next[i];
}
}
}
} void query(char *key) {
trie *p = rt;
cnt = 0;
int ok = 0;
while(*key) {
int t = int(*key);
while(p != rt && p->next[t] == NULL) p = p->fail;
p = p->next[t];
if(p == NULL) p = rt;
trie *tmp = p;
while(tmp != rt && tmp->flag != 0) {
vi[cnt] = tmp->num;
cnt += tmp->flag;
tmp = tmp->fail;
}
key++;
}
}
int main() {
int n,m;
cin >> n;
getchar();
for(int i=0; i<n; i++) {
gets(keyword);
insert(keyword,i+1);
}
bfs();
int ans = 0;
cin >> m;
getchar();
for(int i=1; i<=m; i++) {
gets(book);
memset(vi,0,sizeof(vi));
cnt = 0;
query(book);
if(cnt != 0) {
ans ++;
printf("web %d:",i);
sort(vi,vi+cnt);
int dd = unique(vi , vi + cnt) - vi;
for(int j=0; j<dd; j++) printf(" %d",vi[j]);
puts("");
}
}
printf("total: %d\n",ans);
return 0;
}
HDU 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 ...
- hdu 2896 病毒侵袭_ac自动机
题意:略 思路:套用ac自动机模板 #include <iostream> #include<cstdio> #include<cstring> using nam ...
- HDU 2896 病毒侵袭 AC自己主动机题解
本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...
- HDU 2896 病毒侵袭(AC自动机水)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2896 病毒侵袭【AC自动机】
<题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...
- hdu2896 病毒侵袭 ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...
随机推荐
- memcache的使用
什么是memcache? Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. ...
- windows7下python环境变量配置
默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行或cmd里直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设pyth ...
- nhibernate 3.3 linq扩展
nhibernate的sqlserver linq 全文检索搞了半天 方法一 ,扩展LinqToHqlGeneriatorsRegistry http://www.cnblogs.com/xiarug ...
- iOS NSDictionary、NSData、JSON等 数据类型相互转换
1.NSDictionary类型转换为NSData类型: NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: @&qu ...
- OpenSSL初瞻及本系列的博文的缘由
OpenSSL初瞻及本系列的博文的缘由1.为什么要写关于“OpenSSL源码分析与学习笔记”系列博文?非常重要的两个原因是Heartbleed和学校课程.我虽然是一个非常崇尚自学的人但是并不代表我不擅 ...
- 解决安装 Visual Studio 2012 后无法连接VPN的问题
1. 单击“开始”,单击“运行”,键入“regedit”,然后单击“确定” 2. 找到下面的注册表子项,然后单击它: HKEY_LOCAL_MACHINE\System\CurrentControlS ...
- ural 1294 Mars Satellites
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> u ...
- Yii数据库
http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar http://zhengdl126.iteye.com/blog/1460779 ...
- rsyslog 解决日志截断不读取问题
reopenOnTruncate [on/off] (requires v8.16.0+) Default: off 这是一个实验性的东西告诉rsyslog 重新input file 当它被trunc ...
- C语言的一个关键字——static
Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用static修饰变量,不论这个变量是全局的 ...