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 ...
随机推荐
- 模拟请求(模拟header gzip解压 泛型)
WebClient HeaderData是自定义类对象,存储header信息 private static T GetDataCommonMethod<T>(string url, str ...
- Entity States
Added. The entity does not yet exist in the database. The SaveChanges method must issue an INSERT st ...
- MVC基架生成的Create视图
@model MyMusicStore.Models.Album @{ ViewBag.Title = "Create"; } <h2>Create</h ...
- siliverlight某些事件无法响应
对一些无法响应的时间,需要注册 控件名:XZWT_TreeViewItem 事件:this.XZWT_TreeViewItem_MouseLeftButtonDown 具体注册方法: XZWT_Tre ...
- Gradle编译失败 generating the main dex list
编译打包的时候出现这个错误,信息很少. * What went wrong: Execution failed for task ':camCard_Asia_Trunk:transformClass ...
- Win8Metro(C#)数字图像处理--2.29图像除法运算
原文:Win8Metro(C#)数字图像处理--2.29图像除法运算 [函数名称] 图像除法函数DivisionProcess(WriteableBitmap src, WriteableBit ...
- tensorflow 1.0 学习:模型的保存与恢复
将训练好的模型参数保存起来,以便以后进行验证或测试,这是我们经常要做的事情.tf里面提供模型保存的是tf.train.Saver()模块. 模型保存,先要创建一个Saver对象:如 saver=tf. ...
- 在Visual Studio 2017中找不到.NET Framework 4.6.2
原文 https://blogs.msdn.microsoft.com/benjaminperkins/2017/03/23/net-framwork-4-6-2-not-in-visual-stud ...
- Android零基础入门第62节:搜索框组件SearchView
原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当 ...
- 关于 Apache 2.4 配置PHP时的错误记录
1. 访问虚拟配置的站点抛出 Forbidden 403 错误 解决办法: <Directory E:/Xingzhi/Php/xingzhi.xingzhi.com/> Opti ...