hdu 3056 病毒侵袭持续中 AC自己主动机
http://acm.hdu.edu.cn/showproblem.php?pid=3065
刘汝佳的模板真的非常好用,这道题直接过
学到:
cnt数组记录单词出现次数
以及map存储单词编号与字符串,便于处理相关信息
上代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <map>
using namespace std; const int SIGMA_SIZE=128;
const int MAXNODE = 1005*55;
const int SSIZE = 2000000+100; struct AC
{
int f[MAXNODE];
int ch[MAXNODE][SIGMA_SIZE];
int cnt[MAXNODE];
int val[MAXNODE];
int last[MAXNODE];
int sz;
void init()
{
memset(cnt,0,sizeof(cnt));
memset(ch[0],0,sizeof(ch[0]));
sz=1;
f[0]=last[0]=val[0]=0;
}
inline void clear(){memset(cnt,0,sizeof(cnt));}
void insert(string s,int v)
{
int u=0,n=s.size();
for(int i=0;i<n;i++)
{
int c=s[i];
if(!ch[u][c])
{
val[sz]=0;
memset(ch[sz],0,sizeof(ch[sz]));
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
void print(int j)
{
if(j)
{
cnt[val[j]]++;
print(last[j]);
}
}
void getfail()
{
queue<int>q;
for(int c=0;c<SIGMA_SIZE;c++)
{
int u=ch[0][c];
if(u){f[u]=0;q.push(u);last[u]=0;}
}
while(!q.empty())
{
int r=q.front();q.pop();
for(int c=0;c<SIGMA_SIZE;c++)
{
int u=ch[r][c];
if(!u)continue;
q.push(u);
int v=f[r];
while(v && !ch[v][c])v=f[v];
f[u]=ch[v][c];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
void find(char *T)
{
int n=strlen(T);
int j=0;
for(int i=0;i<n;i++)
{
int c = T[i];
while(j && !ch[j][c])j=f[j];
j=ch[j][c];
if(val[j])print(j);
else
if(last[j])print(last[j]);
}
}
}; AC ac;
char str[SSIZE];
int main()
{
//freopen("hdu3056.txt","r",stdin);
int n;
string word;
while(~scanf("%d",&n))
{
ac.init();
map<int, string> ms;
for(int i=1;i<=n;i++)
{
cin >> word;
ms[i]=word;
ac.insert(word,i);
}
ac.getfail();
scanf("%s",str);
ac.find(str);
for(int i=1;i<=n;i++)
{
////////////////
//printf("%d %d\n",i,ac.cnt[i]);
///////////////////
if(ac.cnt[i])
{
cout << ms[i] << ": " << ac.cnt[i] << endl;
}
}
}
return 0;
}
hdu 3056 病毒侵袭持续中 AC自己主动机的更多相关文章
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- HDU 3065 病毒侵袭持续中
HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3065 病毒侵袭持续中(AC自己主动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...
- hdu 3065 病毒侵袭持续中【AC自动机】
<题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小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 ...
- HDU3065 病毒侵袭持续中 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 3065 病毒侵袭持续中 (模板题)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- 内容提供者 DocumentProvider Uri工具类
Activity /**详见http://blog.csdn.net/coder_pig/article/details/47905881 Calendar Provider:日历提供者,就是针对针对 ...
- FreeMarker辅助
/** * FreeMarker 辅助类 * @author Rubekid * */ public class FreeMarkerHelper { /** * 模板文件存放目录 */ privat ...
- java读取网页
package cn.stat.p4.ipdemo; import java.io.IOException; import java.io.InputStreamReader; import java ...
- h5标签canvas关于getImageData跨域的问题
h5标签canvas关于getImageData跨域的问题 在学习h5的时候,canvas标签中getImageData()报错:security error! 具体代码如下(chrome浏览器): ...
- 线段树:Segment Tree(单点修改/区间修改模板) C++
线段树是非常有效的数据结构,可以快速的维护单点修改,区域修改,查询最大值,最小值等功能. 同时,它也很重要.如果有一天比赛,你卡在了一道线段树模板题目上,这就真的尴尬了.不过,随着时代的进步,题目也越 ...
- Say bye to CMake and Makefile
用了几年的CMake,最近想试着琢磨如何将C++应用的动态链接全部改成静态链接,发现还需要研究CMake的用法,进入CMake的文档, http://www.cmake.org/cmake/help/ ...
- 扩展编写jquery插件的方法
比如要扩展验证功能(jquery.validate.js)中的 messages: { required: "This field is required.", remote: & ...
- 创建C#DLL
1. 创建classlibrary 2.编写一个COM接口和一个COM类 [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")] public ...
- 使用OC和swift创建系统自带的刷新界面
使用OC和swift创建系统自带的刷新界面 一:swift刷新界面代码: import UIKit class ViewController: UITableViewController { // 用 ...
- arm get_vector_swi_address
unsigned long* get_vector_swi_addr() { const void *swi_addr = 0xFFFF0008; unsigned ; unsigned ; unsi ...