【AHOI2005】病毒检测
题目描述
科学家们在Samuel星球上的探险仍在继续。非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地。
科学家们经过几个昼夜的研究,发现这些RNA片段中有许多是未知的病毒!
每个RNA片段都是由A、C、T、G组成的序列。科学家们也总结出了Samuel星球上的“病毒模版片段”。一个模版片段是由A、C、T、G的序列加上通配符 和 ? 来表示。其中 的意思是可以匹配上0个或任意多个字符,而 ? 的意思是匹配上任意一个字母。
如果一个RNA片段能够和“病毒模版片段”相匹配,那么这个RNA片段就是未知的病毒。
例如,假设“病毒模版片段”为A*G?C。RNA片段:AGTC,AGTGTC都是未知的病毒,而RNA片段AGTGC则不是病毒。
由于,机器人搜集的这些RNA片段中除去病毒的其他部分都具有非常高的研究价值。所以科学家们希望能够分辨出其中哪些RNA片段不是病毒,并将不是病毒的RNA片段运回宇宙空间站继续进行研究。
科学家将这项任务交给了小联。现在请你为小联编写程序统计哪些RNA片段不是病毒。
输入输出格式
输入格式:
第一行有一个字符串,由A、C、T、G、*、?
组成。表示“病毒模版片段”。“病毒模版片段”的长度不超过1000。第二行有一个整数N(0<N<500),表示机器人搜集到的RNA片段
的数目。随后的N行,每一行有一个字符串,由A、C、T、G组成,表示一个RNA片段。每个RNA片段的长度不超过500。注意:“病毒模版片段”和
RNA片段的长度都至少为1。
输出格式:
只有一行输出,为整数M,即不是病毒的RNA片段的数目。
输入输出样例
A*G?C
3
AGTC
AGTGTC
AGTGC
1
说明
输入中的RNA片段AGTGC不是病毒。
题解:
建好Trie树,直接以当前所在的节点和病毒模版片段所在的位置 为关键词 bfs 即可
注意状态判重, 可以考虑加个hash,队列一定要手打....
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int N=,M=,MOD=;
struct node
{
int next[];
int cnt;
}a[N];
char s[M],h[M];
int num=,root=;
void Clear()
{
a[num].cnt=;
for(int i=;i<=;i++)a[num].next[i]=;
}
int tot=;
void adds()
{
scanf("%s",h);
int p=root;
tot+=strlen(h);
for(int i=,ls=strlen(h);i<ls;i++)
{
if(a[p].next[h[i]-'A'])p=a[p].next[h[i]-'A'];
else
{
a[p].next[h[i]-'A']=++num;
Clear();
p=num;
}
}
a[p].cnt++;
}
int head[MOD],number=;
struct Lin{
int next,to;
}t[MOD*];
void add(int x,int y)
{
int k=(x*+y)%MOD;
t[++number].next=head[k];
t[number].to=x*+y;
head[k]=number;
}
bool Ask(int x,int y)
{
int goal=(x*+y),k=goal%MOD;
for(int i=head[k];i;i=t[i].next)
if(t[i].to==goal)return false;
return true;
}
struct pipi
{
int x,p;
}q[MOD];
int ans=;
char to[]={'A','G','T','C'};
void flowersearch()
{
q[].x=root;q[].p=-;
int t=,sum=;
int y,p;
int ls=strlen(s)-;
while(t!=sum)
{
t++;t%=MOD;
y=q[t].x;p=q[t].p;
if(p==ls)
{
if(a[y].cnt)
ans+=a[y].cnt,a[y].cnt=;
continue;
}
if(!Ask(y,p))continue;
add(y,p);
if(s[p+]>='A' && s[p+]<='Z')
{
if(!a[y].next[s[p+]-'A'])continue;
sum++;sum%=MOD;
q[sum].x=a[y].next[s[p+]-'A'];q[sum].p=p+;
}
else
{
for(int i=;i<=;i++)
if(a[y].next[to[i]-'A'])
{
sum++;sum%=MOD;
q[sum].x=a[y].next[to[i]-'A'];
q[sum].p=p+;
}
if(s[p+]=='*')
{
for(int i=;i<=;i++)
if(a[y].next[to[i]-'A'])
{
sum++;sum%=MOD;
q[sum].x=a[y].next[to[i]-'A'];
q[sum].p=p;
}
sum++;sum%=MOD;
q[sum].x=y;q[sum].p=p+;
}
}
}
}
int main()
{ scanf("%s",s);
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)adds();
if(tot>=*)
{
printf("");
return ;
}
flowersearch();
printf("%d\n",n-ans);
return ;
}
【AHOI2005】病毒检测的更多相关文章
- 【BZOJ1966】[AHOI2005]病毒检测(动态规划)
[BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...
- [AHOI2005]病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- P2536 [AHOI2005]病毒检测
反思 对于*符号,明明可以让相同位置再次匹配下一个,或者跳过当前位置匹配,但是却写了个把trie的子树全部push进队列的垃圾写法,结果一直MLE 告辞 思路 模板串多且不长,可以塞到trie树里,这 ...
- 【[AHOI2005]病毒检测】
\(Trie\) 树+搜索 我用的是\(dfs\) 首先对于将所有的RNA片段都建到\(Trie\)树里去,之后来匹配那个模板串就好了 如果是匹配的位置是字母,那么我们就继续往下匹配 如果是\(?\) ...
- bzoj1966:[AHOI2005]病毒检测
传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...
- Luogu P2536 [AHOI2005]病毒检测
题意 给一个有通配符的模式串和 \(n\) 个文本串,其中 ? 可以匹配任意字符,* 可以匹配 \(0\) 或任意多个字符,求 \(n\) 个文本串中无法与模式串匹配的数量. \(\texttt{Da ...
- 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测
话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...
- bzoj1966: [Ahoi2005]VIRUS 病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- BZOJ1966 [Ahoi2005]VIRUS 病毒检测 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1966 题意概括 现在有一些串和一个病毒模板.让你统计非病毒串的总数.串个数<=500. 串由 ...
随机推荐
- Python实现基于协程的异步爬虫
一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Jiryu Davis 与 Python ...
- [ZLXOI2015]殉国
2057. [ZLXOI2015]殉国 http://cogs.pro/cogs/problem/problem.php?pid=2057 ★☆ 输入文件:BlackHawk.in 输出文件: ...
- stringify 字符串转化成json方法
参照原文:http://www.cnblogs.com/damonlan/ http://www.jb51.net/article/29893.htm stringify的作用主要是序列化对象(转化为 ...
- centos 6.5安装并配置mysql
折腾了半天终于把mysql安装并配置好了,以下是安装步骤和遇到问题的解决方式 1.查看机器上是否已经安装了mysql或其相关项 # yum list installed | grep mysql如果安 ...
- EasyUI中easyui-combobox的onchange事件。
html: <select id="cbox" class="easyui-combobox" name="dept" style=& ...
- Java可重入锁如何避免死锁
本文由https://bbs.csdn.net/topics/390939500和https://zhidao.baidu.com/question/1946051090515119908.html启 ...
- Linux命令及lamp搭建
单纯属于Linux的命令:1.强制卸载有依赖关系的软件包: rpm -e httpd-2.2.15-26.el6.x86_64 --nodeps(--nodeps表示无依赖)4.删除当前目录所有的文件 ...
- 点开GitHub之后,瑟瑟发抖...的我
我说句实在话啊,GitHub这个网址真的很能勾起人学习的欲望,一进入GitHub的注册页面真的让我这个英语学渣瑟瑟发抖,瞬间立下个flag:好好学习英语..... 我对python的求知欲怎么能被英语 ...
- 英语词汇周计划(1-1)group 1
abandon 1.He abandoned his wife and ten-year-old daughter. 2.abandon oneself to do sth 3.with abando ...
- c# 工具类(字符串和时间,文件)
using System; using System.IO; using System.Text.RegularExpressions; using System.Windows.Browser; n ...