题目描述

科学家们在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片段的数目。

输入输出样例

输入样例#1:

A*G?C
3
AGTC
AGTGTC
AGTGC
输出样例#1:

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】病毒检测的更多相关文章

  1. 【BZOJ1966】[AHOI2005]病毒检测(动态规划)

    [BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...

  2. [AHOI2005]病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  3. P2536 [AHOI2005]病毒检测

    反思 对于*符号,明明可以让相同位置再次匹配下一个,或者跳过当前位置匹配,但是却写了个把trie的子树全部push进队列的垃圾写法,结果一直MLE 告辞 思路 模板串多且不长,可以塞到trie树里,这 ...

  4. 【[AHOI2005]病毒检测】

    \(Trie\) 树+搜索 我用的是\(dfs\) 首先对于将所有的RNA片段都建到\(Trie\)树里去,之后来匹配那个模板串就好了 如果是匹配的位置是字母,那么我们就继续往下匹配 如果是\(?\) ...

  5. bzoj1966:[AHOI2005]病毒检测

    传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...

  6. Luogu P2536 [AHOI2005]病毒检测

    题意 给一个有通配符的模式串和 \(n\) 个文本串,其中 ? 可以匹配任意字符,* 可以匹配 \(0\) 或任意多个字符,求 \(n\) 个文本串中无法与模式串匹配的数量. \(\texttt{Da ...

  7. 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测

    话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...

  8. bzoj1966: [Ahoi2005]VIRUS 病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  9. BZOJ1966 [Ahoi2005]VIRUS 病毒检测 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1966 题意概括 现在有一些串和一个病毒模板.让你统计非病毒串的总数.串个数<=500. 串由 ...

随机推荐

  1. Packet for query is too large (84 > -1).

    windows下的resin配置连接mysql,常用的安全的做法是将数据库信息配置到conf目录下的resin.xml文件中. 因为resin连接mysql不是必须的,所以resin本身没有提供mys ...

  2. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  3. Linux - IDA - 安装 ( 带F5功能 )

    Linux - IDA - 安装 ( 带F5功能 ) 0x00 前言 最近在熟悉deepin系统,想着把逆向的一些软件也迁移过去,但像ida,Ollydbg这些工具一般都是在windows下使用,所以 ...

  4. 电子称DIY(贴应变片+写代码)

    第一步.应变片介绍   ---------------------------------------------------------------------------------------- ...

  5. 算法题丨4Sum

    描述 Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  6. solr云的简单搭建(了解)

    1.认识系统架构 1.1.集群概述 1.1.1.单点服务器的问题 我们之所以要学习集群,是因为单点服务器,存在一系列的问题. 我们以前学习的JavaEE项目,都是部署在一台Tomcat上,所有的请求, ...

  7. zuul入门(3)开发zuul的过滤器

    1.编写Zuul过滤器(Java&Groovy) 理解过滤器类型和请求生命周期后,我们来编写一个Zuul过滤器.编写Zuul的过滤器非常简单,我们只需继承抽象类ZuulFilter,然后实现几 ...

  8. IntelliJ IDEA开发Scala代码,与java集成,maven打包编译

    今天尝试了一下在IntelliJ IDEA里面写Scala代码,并且做到和Java代码相互调用,折腾了一下把过程记录下来. 首先需要给IntelliJ IDEA安装一下Scala的插件,在IDEA的启 ...

  9. byte在计算机中的存储方式--Double.byteValue()的输出结果思考

    先举三个栗子: 1. public static void main(String[] args) { Double d = new Double(123.56); byte b = d.byteVa ...

  10. 人工智能算法综述(二) RNN and LSTM

    接上一篇 :AI算法综述 (一) RNN:循环神经网络 and LSTM 长短期记忆网络 LSTM就是一个RNN网络,外部的结构是一样的,主要是单元的内在结构不同.或者说LSTM是为了让RNN能够更好 ...