\(Trie\) 树+搜索

我用的是\(dfs\)

首先对于将所有的RNA片段都建到\(Trie\)树里去,之后来匹配那个模板串就好了

如果是匹配的位置是字母,那么我们就继续往下匹配

如果是\(?\),我们必须要略过\(Trie\)树上的一位去匹配

如果是\(*\),我们可以先考虑直接忽略这一位,也可以直接把这一位当成\(?\)来看,或者是在\(Trie\)树上略过一位,但是在模板串上的匹配仍为当前位置,这样就能实现在\(Trie\)树上忽略多位进行匹配了

一旦某一位匹配成功了,我们如果还有状态到达这一步就没有什么必要了,所以开一个\(bitset\)来进行记忆化就好了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<bitset>
#define re register
#define maxn 500005
int son[maxn][4],flag[maxn];
int n,m,cnt,L,ans;
char S[1001],T[1001];
std::bitset<1001> f[maxn];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline int ch(char p)
{
if(p=='A') return 0;
if(p=='G') return 1;
if(p=='T') return 2;
if(p=='C') return 3;
}
inline void ins()
{
int len=strlen(S+1);
int now=0;
for(re int i=1;i<=len;i++)
{
if(!son[now][ch(S[i])]) son[now][ch(S[i])]=++cnt;
now=son[now][ch(S[i])];
}
flag[now]++;
}
void dfs(int now,int t)
{
if(t==L+1)//匹配成功
{
ans+=flag[now];
flag[now]=0;
return;
}
if(f[now][t]) return;
f[now][t]=1;//记忆化
if(T[t]>='A'&&T[t]<='Z')
{
if(!son[now][ch(T[t])]) return;
dfs(son[now][ch(T[t])],t+1);
}//是字母,那么我们就继续往下匹配
else
{
if(T[t]=='?')
{
for(re int i=0;i<4;i++)
if(son[now][i]) dfs(son[now][i],t+1);//在Trie上忽略一位,同时模板串匹配位置加1
}
if(T[t]=='*')
{
dfs(now,t+1);//忽略*,即用0个字符来代替它
for(re int i=0;i<4;i++)
if(son[now][i]) dfs(son[now][i],t+1),dfs(son[now][i],t);
//第一个dfs直接把这一位当成$?$来看,第二个dfs就能实现一个*代替多个字符
}
}
}
int main()
{
scanf("%s",T+1);
L=strlen(T+1);
n=read();
for(re int i=1;i<=n;i++)
scanf("%s",S+1),ins();
dfs(0,1);
printf("%d\n",n-ans);
return 0;
}

【[AHOI2005]病毒检测】的更多相关文章

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

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

  2. [AHOI2005]病毒检测

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

  3. P2536 [AHOI2005]病毒检测

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

  4. bzoj1966:[AHOI2005]病毒检测

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

  5. Luogu P2536 [AHOI2005]病毒检测

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

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

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

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

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

  8. 【AHOI2005】病毒检测

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

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

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

随机推荐

  1. Struts2初步学习总结

    Struts2当时上课的时候老师给我们讲过,了解过一些,但也仅仅是了解,,,没动手去做,准确的说是试了一下,然后没做成功,,,现在又想把这个夹生饭给煮一下了,,,, 结合W3Cschool和轻量级Ja ...

  2. Shiro登录校验

    shiro是一种权限认证框架,实现一个简单的登录鉴权: 1.控制器层: @Controller @RequestMapping("/blogger") public class B ...

  3. nodejs的jsonrpc调用

    记录下使用nodejs发送jsonrpc请求: var express = require('express'); var router = express.Router(); var request ...

  4. MySQL 8.0 压缩包版安装方法

    转自:https://blog.csdn.net/yangs_2012/article/details/80412016 注意: 操作系统:Windows 10 专业版(64位) MySQL版本:my ...

  5. java泛型使用

    泛型的解释 现在感觉泛型是一个值得学习的地方,就抽出时间来学习和总结一下泛型的使用. Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允 ...

  6. tomcat启动编码等部署遇到问题

    版权声明:本文为博主原创文章,转载请注明文章链接.https://blog.csdn.net/xiaoanzi123/article/details/58254318 2017-02-27 21:01 ...

  7. Spring_Spring与IoC_基于注解的DI

    一.基本注解的使用 (1)导入AOP的Jar包 (2) 与set()无关 二.组件扫描器的base-package 三.@Component相关注解 四.@Scope 五.域属性的注入 (1)byTy ...

  8. HTML颜色代码

    记录十种个人比较喜欢的颜色: #19CAAD   #8CC7B5  #A0EEE1  #BEE7E9  #BEEDC7 #D6D5B7  #D1BA74  #E6CEAC  #ECAD9E  #F46 ...

  9. 关于JQuery animate()方法

    html: <button>点击我</button> <p>如果你想在一个涉及动画的函数之后来执行语句,请使用callback函数</p> <di ...

  10. Linux基础之命令练习Day3-文件管理:cat,tar,gzip,vim,ln

    一. 文件合并 cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [ ...