题目描述

科学家们在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. Lucene 的索引文件锁原理

    Lucene 的索引文件锁原理 2016/11/24 · IT技术 · lucene   环境 Lucene 6.0.0Java “1.8.0_111”OS Windows 7 Ultimate 线程 ...

  2. $.each遍历json数组

    1.遍历单层json数组 我们把idx和obj都打印出来看看,到底是什么东西 var json1 =[{"id":"1","tagName" ...

  3. JAVA_SE基础——17.方法的重载

    方法重载: 方法重载就是方法名称重复,加载参数不同. 具体规范: 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类 ...

  4. 微信qq,新浪等第三方授权登录的理解

    偶们常说的第三方是指的微信,qq,新浪这些第三方,因为现在基本每个人都有qq或者微信,那么我们就可以通过这些第三方进行登录.而这些网站比如慕课网是通过第三方获取用户的基本信息 它会有个勾选按钮,提示是 ...

  5. 解决IE8下opacity属性失效问题

    由于opacity属性存在兼容性问题,所以在IE8下,用opacity来设置元素的透明度,会失效,从而导致页面的样式问题. 在IE8及其更早的浏览器下,我们可以使用filter属性,来代替opacit ...

  6. ssl双向认证

    ssl双向认证 一.背景知识 1.名词解释 ca.key: 根证书的私钥 , ca.crt: 根证书的签名证书 server.key, server.crt client.key, client.cr ...

  7. linux centos6.8 下安装mysql 步骤

    安装环境:vmware12.centos6.8.centos中配置阿里云数据元 1.下载mysql 运行: sudo yum -y install mysql-server 如果下载失败,可以卸载重新 ...

  8. An invalid character [32] was present in the Cookie value 错误

    今天在做cookie部分的demo的时候出现了一个错误Servlet部分的代码如下 Date data=new Date(); SimpleDateFormat format=new SimpleDa ...

  9. 理解Node.js安装及模块化

    1.安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.j ...

  10. DOM节点删除之empty和remove区别

    要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty和remove方法 empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只 ...