BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索
Description
科学家们在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片段不是病毒。
Input
第一行有一个字符串,由A、C、T、G、*、? 组成。表示“病毒模版片段”。“病毒模版片段”的长度不超过1000。第二行有一个整数N(0<N<500),表示机器人搜集到的RNA片段的数目。随后的N行,每一行有一个字符串,由A、C、T、G组成,表示一个RNA片段。每个RNA片段的长度不超过500。注意:“病毒模版片段”和RNA片段的长度都至少为1。
Output
只有一行输出,为整数M,即不是病毒的RNA片段的数目。
Sample Input
3
AGTC
AGTGTC
AGTGC
Sample Output
HINT
输入中的RNA片段AGTGC不是病毒。
Solution
把所有RNA片段扔到trie里面。然后用病毒串在trie内搜索来匹配,用bitset记忆化不然会TLE。
然后要注意bitset大小,不然会MLE
#include <bits/stdc++.h> #define ll long long
#define inf 0x3f3f3f3f
#define il inline namespace io { #define in(a) a=read()
#define out(a) write(a)
#define outn(a) out(a),putchar('\n') #define I_int int
inline I_int read() {
I_int x = , f = ; char c = getchar() ;
while( c < '' || c > '' ) { if( c == '-' ) f = - ; c = getchar() ; }
while( c >= '' && c <= '' ) { x = x * + c - '' ; c = getchar() ; }
return x * f ;
}
char F[ ] ;
inline void write( I_int x ) {
if( x == ) { putchar( '' ) ; return ; }
I_int tmp = x > ? x : -x ;
if( x < ) putchar( '-' ) ;
int cnt = ;
while( tmp > ) {
F[ cnt ++ ] = tmp % + '' ;
tmp /= ;
}
while( cnt > ) putchar( F[ -- cnt ] ) ;
}
#undef I_int }
using namespace io ; #define N 610 int ans = , n , Len , ch[][] , sz , val[] ;
char a[] ;
std::bitset<> f[] ; int idx(char c) {
if(c == 'A') return ;
if(c == 'C') return ;
if(c == 'T') return ;
if(c == 'G') return ;
if(c == '?') return ;
if(c == '*') return ;
} void insert(char *s) {
int len = strlen(s) , u = ;
for(int i = ; i < len ; i ++) {
int c = idx(s[i]) ;
if(!ch[u][c]) ch[u][c] = ++ sz ;
u = ch[u][c] ;
}
val[u] ++ ;
} void dfs(int u , int now) {
if(now == Len+) {
ans += val[u] ;
val[u] = ;
return ;
}
if(f[u][now]) return ;
f[u][now] = ;
int c = idx(a[now]) ;
if(c <= ) {
if(ch[u][c]) dfs(ch[u][c] , now + ) ;
} else {
if(c == ) {
for(int i = ; i <= ; i ++)
if(ch[u][i]) dfs(ch[u][i] , now + ) ;
} else {
dfs(u , now + ) ;
for(int i = ; i <= ; i ++)
if(ch[u][i]) dfs(ch[u][i] , now) , dfs(ch[u][i] , now + );
}
}
} int main() {
scanf( "%s" , a + ) ;
Len = strlen(a + ) ;
n = read() ;
for(int i = ; i <= n ; i ++) {
char s[] ;
scanf("%s" , s) ;
insert(s) ;
}
dfs( , ) ;
outn(n - ans) ;
return ;
}
BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索的更多相关文章
- BZOJ1966 [Ahoi2005]VIRUS 病毒检测 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1966 题意概括 现在有一些串和一个病毒模板.让你统计非病毒串的总数.串个数<=500. 串由 ...
- [bzoj1966][Ahoi2005][VIRUS 病毒检测] (字符串dp)
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- bzoj1966: [Ahoi2005]VIRUS 病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- bzoj千题计划205:bzoj1966: [Ahoi2005]VIRUS 病毒检测
http://www.lydsy.com/JudgeOnline/problem.php?id=1966 f[i][j] 表示s的前i个和t的前j个是否匹配 转移看代码 注意初始化: f[0][0]= ...
- 【AHOI2005】病毒检测
题目描述 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地. 科学家们经过几 ...
- 【BZOJ1966】[AHOI2005]病毒检测(动态规划)
[BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...
- 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测
话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...
- bzoj1966:[AHOI2005]病毒检测
传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...
- 【[AHOI2005]病毒检测】
\(Trie\) 树+搜索 我用的是\(dfs\) 首先对于将所有的RNA片段都建到\(Trie\)树里去,之后来匹配那个模板串就好了 如果是匹配的位置是字母,那么我们就继续往下匹配 如果是\(?\) ...
随机推荐
- SQL Server 镜像证书过期处理
转自:https://www.cnblogs.com/trams/archive/2012/01/13/2321637.html SQL Server 镜像证书过期处理 今天镜像中的主服务器进行维护重 ...
- Ubuntu14.04+eclipse下cocos2d-x3.0正式版环境的搭建
环境: ubuntu14.04 adt-bundle-linux-x86_64 android-ndk-r9d-linux-x86_64 cocos2d-x-3.0正式版 apache-ant 1.9 ...
- [LeetCode] 181. Employees Earning More Than Their Managers_Easy tag: SQL
The Employee table holds all employees including their managers. Every employee has an Id, and there ...
- [LeetCode] 443. String Compression_Easy tag:String
Given an array of characters, compress it in-place. The length after compression must always be smal ...
- Java调用本地命令
参考:http://blog.csdn.net/zhu_xun/article/details/19539513 http://www.cnblogs.com/kingcucumber/p/31801 ...
- jquery 的each函数
each函数经常用到.它本身就是一个循环遍历 你可以可以break continue 但这是在for while循环中 each中我们可以这样 下面的例子是遍历 MyTable中所有的tr 第一个td ...
- Vim/Vi的使用
Vim 是vi的加强 Gvim图形化的vim Vim/Vi简介 Vim/Vi是一个功能强大的全屏幕文本编辑器,是Linux/Unix上最常用的文本编辑器,他们 的作用是建立,编辑,显示文本文件 Vi ...
- Lintcode: k Sum II
Given n unique integers, number k (1<=k<=n) and target. Find all possible k integers where the ...
- 使用PowerMockito 对静态类进行mock
Mock的中文的意思就是模拟,Mockito是mock的扩展,但是Mockito并不支持对静态类的mock,所以我们引入PowerMockito实现对静态类的mock. 首先pom添加PowerMoc ...
- APB总线
APB(Advance Peripheral Bus)是AMBA总线的一部分,从1998年第一版至今共有3个版本. AMBA 2 APB Specfication:定义最基本的信号interface, ...