题目描述

科学家们在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. 团队作业7——第二次项目冲刺(Beta版本12.10)

    项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:头像功能原型设计.头像裁剪功能.头像上传功能.测试 计划完成的内容:头像功能测试.bug修复 每个人的工作 (有work item 的I ...

  2. 开启Linux的share

    1.挂载Install  Vmare Tool 2.解压VMwareTools.tar.gz 3.安装share目录 4.shared Folders Enabled 添加共享的目录. 在自己的Unb ...

  3. Python web服务器

    Python 配置wsgi接口# 引入Python wsgi包 from wsgiref.simple_server import make_server # 撰写服务器端程序代码 def Appli ...

  4. 基础篇 - SQL 的约束

    基础篇 - SQL 的约束       约束 一.实验简介 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.本节实验将在实践操作中熟悉 MySQL 中的几种约束. 二 ...

  5. GPUImage滤镜效果翻译

    #import"GPUImageBrightnessFilter.h"//亮度 #import"GPUImageExposureFilter.h"//曝光 #i ...

  6. Linux的安装和使用技巧

    LinuxCentOs开始设置一个普通的用户,如果想进入root用户,可以su然后设置密码,然后第二次再次输入su,然后输入相同的密码就可以进去了 有很多命令需要在root下才能执行,但是在创建时却是 ...

  7. 新概念英语(1-137)A pleasant dream

    Lesson 137 A pleasant dream 美好的梦 Listen to the tape then answer this question. What would Julie like ...

  8. 阿里云API网关(18)请求报文和响应报文

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  9. zuul入门(1)zuul 的概念和原理

    一.zuul是什么 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. ...

  10. BBS的登陆——发帖——回帖

    整体分析思路 1.首先手工熟悉一遍业务流程 2.录制脚本,选取协议,设置录制选项 1)Run-Time-Settings——Preferences——Options设置3个超时 2)Recording ...