HDU 3065:病毒侵袭持续中(AC自动机)
http://acm.hdu.edu.cn/showproblem.php?pid=3065
题意:中文题意。
思路:直接插入然后用一个数组记录id和cnt,因为n只有1000,可以开一个数组判断第几个字符串出现过的次数,然后输出就好了。
坑点:多组输入!!!然后因为new出来的空间要自己释放,因此需要用一个vector装起来(似乎多此一举),最后delete掉。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define N 1010
#define M 2000010
#define TOL 128
typedef struct Node {
Node* next[TOL];
Node* fail;
int id, cnt;
Node () {
for(int i = ; i < TOL; i++) next[i] = NULL;
id = cnt = ;
fail = NULL;
}
} node; char s[N][], str[M]; class AC_DFA { private:
node* root;
int ans[N], n;
vector<node*> dic; public:
AC_DFA(int now) {
dic.clear();
root = new Node();
dic.push_back(root);
n = now;
memset(ans, , sizeof(ans));
} ~AC_DFA() {
for(int i = ; i < dic.size(); i++) delete dic[i];
} void insert(char *s, int id) {
int len = strlen(s);
node* now = root;
for(int i = ; i < len; i++) {
char c = s[i];
if(now->next[c] == NULL) now->next[c] = new Node(), dic.push_back(now->next[c]);
now = now->next[c];
}
now->id = id;
now->cnt++;
} void build() {
queue<node *> que;
que.push(root);
root->fail = NULL;
while(!que.empty()) {
node* now = que.front();
que.pop();
for(int i = ; i < TOL; i++) {
if(now->next[i]) {
node* p = now->fail;
while(p && p->next[i] == NULL) p = p->fail;
if(p) now->next[i]->fail = p->next[i];
else now->next[i]->fail = root;
que.push(now->next[i]);
} else {
if(now == root) now->next[i] = root;
else now->next[i] = now->fail->next[i];
}
}
}
} void match(char *s) {
int len = strlen(s);
node *now = root, *p;
for(int i = ; i < len; i++) {
char c = s[i];
while(now != root && now->next[c] == NULL)
now = now->fail;
now = now->next[c];
p = now;
while(p) {
if(p->cnt) ans[p->id] += p->cnt;
p = p->fail;
}
}
} void print() {
for(int i = ; i <= n; i++)
if(ans[i]) printf("%s: %d\n", s[i], ans[i]);
} }; int main() {
int n;
while(~scanf("%d", &n)) {
AC_DFA ac(n);
for(int i = ; i <= n; i++) {
scanf("%s", s[i]);
ac.insert(s[i], i);
}
scanf("%s", str);
ac.build();
ac.match(str);
ac.print();
}
return ;
}
HDU 3065:病毒侵袭持续中(AC自动机)的更多相关文章
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- hdoj 3065 病毒侵袭持续中(AC自动机)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...
- HDU 3065 病毒侵袭持续中
HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3065 病毒侵袭持续中【AC自动机】
<题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是 ...
- HDU 3065 病毒侵袭持续中(AC自己主动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- hdu----(3065)病毒侵袭持续中(AC自动机)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 3065病毒侵袭持续中
病毒侵袭持续中 http://acm.hdu.edu.cn/showproblem.php?pid=3065 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 3065 病毒侵袭持续中 (模板题)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU3065 病毒侵袭持续中 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- 服务器做RAID10
将接上Raid card的机器开机,根据提示按组合键进入Raid配置界面(一般是按Ctrl+H,具体的根据提示进行即可) 点击Configuration Wizard,选择new configur ...
- WPF最大化避免覆盖任务栏
原文:WPF最大化避免覆盖任务栏 WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏.如何解决这个问题呢? 我在Google里面搜到一篇文章,要用到Win32 API,通过让WP ...
- js操作select控件大全(包含新增、修改、删除、选中、清空、判断存在等)
原文:js操作select控件大全(包含新增.修改.删除.选中.清空.判断存在等) js操作select控件大全(包含新增.修改.删除.选中.清空.判断存在等) js 代码// 1.判断select选 ...
- ARTS 12.10 - 12.14
从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 我在我的读者群中推荐出 ARTS 的任务,每个人每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Sha ...
- C#WeakReference弱引用
原文:C#WeakReference弱引用 弱引用:在引用对象的同时,允许垃圾回收该对象. .NET中提供了WeakReference对象来实现这个功能. 对于那些创建便宜但耗费大量内存的对象,即希望 ...
- QML Settings 小的示例
QML 中使用 Settings 可以保存一些简单的信息,例如用户名,密码,窗口位置,大小等,没有Sqlite那么麻烦,简单易用哦~~~(环境:Qt5.8 for android ,Windows ...
- 让VC2012生成的程序支持XP系统(修改mkspecs\win32-msvc2012\qmake.conf,QT的DLL都是支持XP的,只与EXE有关)good
如果用的编译器是VC2012以上,那么默认生成出的程序是不能运行在XP系统上的.所以需要修改链接参数 我们要做的是修改qmake.conf文件中的参数,文件路径根据开发环境不同而不同下面以5.1.1 ...
- 关于 win32 下磁盘的遍历方法
最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了 ...
- delphi android 录像(使用了JMediaRecorder,MediaRecorder的使用方法可参考网上java的相关说明)
delphi xe系列自带的控件都无法保存录像,经网友帮忙,昨天终于实现了录像功能(但有个问题是录像时无画面显示),程序主要使用了JMediaRecorder,MediaRecorder的使用方法可参 ...
- libjingler-0.6.2在windows和ubuntu 10.04下的编译(Google Talk)
Libjingle版本:0.6.2 所需的资源: gtest-1.6.0.zip http://download.csdn.net/detail/cl_gamer/48 ...