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 ...
随机推荐
- Android Init语言
Android Init语言是一种特别简单的语言,专门用来写Android的Init进程使用的配置文件的. 相当于Linux系统中的rc文件(这句话对于Linux者多半是句废话). Android I ...
- CentOS下建立本地YUM源并自动更新
1. 尽管有很多的免费镜像提供yum源服务,但是还是有必要建立自己的yum服务器,主要出于以下几点考虑: l 网络速度:访问互联网可能比较慢 l 节省带宽:如果有大量的服务器,架设自己的yum源可以有 ...
- GUI编程(一)-----概述
软件的交互方式 1.命令交互方式. 2.图像交互方式.Java提供了专业的API用于开发图形用户界面(GUI--> Graphic User Interface). GUI的分类 1.AW ...
- 转:DSP学习经验
转载:http://www.cnblogs.com/MrYang/archive/2010/12/21/1913035.html
- ionic ng-src 在网页显示,但是导出apk在android手机中运行不显示图片
解决方法参照: http://stackoverflow.com/questions/29896158/load-image-using-ng-src-in-android-ionic-aplicat ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- 8.2.1.3 Range Optimization
8.2.1.3 Range Optimization 范围访问方法使用一个单个的索引来检索表记录的自己,包含在一个或者索引值区间. 它可以用于一个单独的部分或者多个部分的索引,下面章节给出了一个详细的 ...
- 【HDOJ】1500 Chopsticks
DP. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm ...
- BZOJ1640: [Usaco2007 Nov]Best Cow Line 队列变换
1640: [Usaco2007 Nov]Best Cow Line 队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 493 Solved: 2 ...
- 【转】 Spinner的常用技巧
原文网址:http://blog.csdn.net/wanli_smile/article/details/6410388 用法 1 :以资源方式,静态展示 Spinner 选项 1. 在资源 ...