HDU3065(AC自动机入门题)
病毒侵袭持续中
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9831 Accepted Submission(s): 3457
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
- #include<cstdio>
- #include<cstring>
- #include<queue>
- using namespace std;
- const int MAXN=;
- const int N=;
- int n;
- int Hash[];
- struct ID{
- char ss[];
- ID()
- {
- memset(ss,,sizeof(ss));
- }
- }words[];
- struct Trie{
- int next[MAXN][N],fail[MAXN],end[MAXN];
- int tot,root,id;
- int newnode()
- {
- for(int i=;i<N;i++)
- next[tot][i]=-;
- end[tot++]=;
- return tot-;
- }
- void init()
- {
- tot=;
- root=newnode();
- }
- void insert(char buf[],int id)
- {
- int len=strlen(buf);
- int now=root;
- for(int i=;i<len;i++)
- {
- int k=buf[i];
- if(next[now][k]==-)
- next[now][k]=newnode();
- now=next[now][k];
- }
- end[now]=id;
- }
- void build()
- {
- fail[root]=root;
- queue<int> que;
- for(int i=;i<N;i++)
- if(next[root][i]==-)
- next[root][i]=root;
- else
- {
- fail[next[root][i]]=root;
- que.push(next[root][i]);
- }
- while(!que.empty())
- {
- int now=que.front();
- que.pop();
- for(int i=;i<N;i++)
- if(next[now][i]==-)
- next[now][i]=next[fail[now]][i];
- else
- {
- fail[next[now][i]]=next[fail[now]][i];
- que.push(next[now][i]);
- }
- }
- }
- void query(char buf[])
- {
- int len=strlen(buf);
- int now=root;
- for(int i=;i<len;i++)
- {
- now=next[now][buf[i]];
- int temp=now;
- while(temp!=root)
- {
- if(end[temp]!=)
- Hash[end[temp]]++;
- //若每个模式串只在主串中匹配一次则加上 end[temp]=0;
- temp=fail[temp];
- }
- }
- for(int i=;i<=n;i++)
- {
- if(Hash[i]!=)
- {
- printf("%s: %d\n",words[i].ss,Hash[i]);
- }
- }
- }
- };
- Trie ac;
- char buf[];
- int main()
- {
- while(scanf("%d",&n)!=EOF)
- {
- memset(Hash,,sizeof(Hash));
- ac.init();
- for(int i=;i<=n;i++)
- {
- scanf("%s",words[i].ss);
- ac.insert(words[i].ss,i);
- }
- ac.build();
- scanf("%s",buf);
- ac.query(buf);
- }
- return ;
- }
HDU3065(AC自动机入门题)的更多相关文章
- hdu2222 KeyWords Search AC自动机入门题
/** 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:题意:给定N(N <= 10000)个长度不大于50的模式串,再给定一个长度为L ...
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- HDU2222(AC自动机入门题)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机
/** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...
- 【hdu2222】【poj2945】AC自动机入门题
HDU2222 传送门 题目分析 裸题:注意构建自动机用的是模式串,思想和kmp很类似. code: #include<iostream> #include<cstdio> # ...
- UVALive-4670 AC自动机入门题 求出现次数最多的子串
/** 链接:http://vjudge.net/problem/UVALive-4670 详见lrj训练指南P216 */ #include<bits/stdc++.h> using n ...
- HDU2896(AC自动机入门题)
病毒侵袭 Time Limit:1000MS Memory Limit:32768KB Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这 ...
- HD2222 Keywords Search(AC自动机入门题)
然而还不是很懂=_= #include <iostream> #include <cstring> #include <algorithm> #include &l ...
随机推荐
- Android--绑定服务调用服务的方法
Service依照其启动的方式,可分为两种: 1.Started Started的Service.通过在Application里用startService(Intent intent)方法来启动.这样 ...
- 深度探究apk安装过程
一.先验知识 0.PcakageaManagerService版本号变化 1.概述 2.PackageManagerService服务启动流程 3. PackageManagerService入口 二 ...
- 在pypy环境中运行odoo8
PyPy是一个独立的解析器, 通过即时编译(JIT,Just-in-time)代码避免逐行解释执行来提升运行速度的(将编译过的行代码缓存起来,从而加快速度).我们一般使用的Python一般是使用C实现 ...
- 在eclipse中查找指定文件 [多种方法]
在eclipse中查找指定文件 1.ctrl+h打开搜索界面 File Search: containing text填*,File name patterns填写hello.*,可以找到hell ...
- Phalcon框架如何实现读写分离
Phalcon框架如何实现读写分离 假设你已经在DI容器里注册了俩 db services,如下: <?php // 主库 $di->setShared('dbWrite', functi ...
- Swift中的switch 和 do while
switch后面的()能够省略 OC中的switch假设没有break就会穿透(依次运行),在Swift中不会穿透(可理解默认就有break) OC中入股要在case中定义变量,必要要加上{}确定作用 ...
- 自动提交form表单
<form class="form-inline" name='MD5form' method="post" action="<?php ...
- 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS
一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...
- cURL实现Get和Post
1.Get请求: //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.jb51.n ...
- tomcat安装后问题解决
tomcat安装后问题解决 (1)tomcat无法正常启动的原因分析 JAVA_HOME 配置错误,或者没有配置 如果你的机器已经占有了8080 端口,则无法启动, 解决方法 (1) 你可以808 ...