反思

对于*符号,明明可以让相同位置再次匹配下一个,或者跳过当前位置匹配,但是却写了个把trie的子树全部push进队列的垃圾写法,结果一直MLE

告辞

思路

模板串多且不长,可以塞到trie树里,这个东西貌似叫trie树上模糊匹配?

然后直接bfs爆搜,注意记录一个vis[i][j],表示第i个节点和第j个位置匹配的情况是否被搜过了,然后小心空间就好了

代码

需要O2

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <bitset>
  5. #include <queue>
  6. using namespace std;
  7. int trie[191000][4],Nodecnt,mark[190010],root,ans=0,lens,n,lent;
  8. char s[1010],t[1010];
  9. bitset<191010> vis[1000];
  10. struct QNode{
  11. int pos,numNode;
  12. QNode(int a,int b){
  13. pos=a,numNode=b;
  14. }
  15. };
  16. queue<QNode> q;
  17. int to(char c){
  18. if(c=='A')
  19. return 0;
  20. if(c=='G')
  21. return 1;
  22. if(c=='C')
  23. return 2;
  24. if(c=='T')
  25. return 3;
  26. }
  27. void insert(char *s,int len){
  28. int o=root;
  29. for(int i=1;i<=len;i++){
  30. if(!trie[o][to(s[i])])
  31. trie[o][to(s[i])]=++Nodecnt;
  32. o=trie[o][to(s[i])];
  33. }
  34. mark[o]++;
  35. }
  36. void dfs(int pos,int o){
  37. q.push(QNode(pos,o));
  38. for(int i=0;i<4;i++)
  39. if(trie[o][i])
  40. dfs(pos,trie[o][i]);
  41. }
  42. void query(void){
  43. q.push(QNode(1,0));//pos Node
  44. while(!q.empty()){
  45. QNode x=q.front();
  46. q.pop();
  47. if(vis[x.pos][x.numNode])
  48. continue;
  49. vis[x.pos][x.numNode]=true;
  50. // printf("pos=%d numNode=%d\n",x.pos,x.numNode);
  51. if(x.pos==lens+1){
  52. ans+=mark[x.numNode];
  53. continue;
  54. }
  55. if(s[x.pos]=='*'){
  56. q.push(QNode(x.pos+1,x.numNode));
  57. for(int i=0;i<4;i++)
  58. if(trie[x.numNode][i])
  59. q.push(QNode(x.pos+1,trie[x.numNode][i]));
  60. for(int i=0;i<4;i++)
  61. if(trie[x.numNode][i])
  62. q.push(QNode(x.pos,trie[x.numNode][i]));
  63. }
  64. else if(s[x.pos]=='?'){
  65. for(int i=0;i<4;i++)
  66. if(trie[x.numNode][i])
  67. q.push(QNode(x.pos+1,trie[x.numNode][i]));
  68. }
  69. else{
  70. if(trie[x.numNode][to(s[x.pos])])
  71. q.push(QNode(x.pos+1,trie[x.numNode][to(s[x.pos])]));
  72. }
  73. }
  74. }
  75. int main(){
  76. // freopen("5.in","r",stdin);
  77. scanf("%s",s+1);
  78. lens=strlen(s+1);
  79. scanf("%d",&n);
  80. for(int i=1;i<=n;i++){
  81. scanf("%s",t+1);
  82. lent=strlen(t+1);
  83. insert(t,lent);
  84. }
  85. query();
  86. printf("%d\n",n-ans);
  87. return 0;
  88. }

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

  1. Luogu P2536 [AHOI2005]病毒检测

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

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

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

  3. [AHOI2005]病毒检测

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

  4. 【[AHOI2005]病毒检测】

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

  5. bzoj1966:[AHOI2005]病毒检测

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

  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. [C#]Socket通信BeginReceive异步接收数据何时回调Callback

    原文地址:http://www.cnblogs.com/wangtonghui/p/3277303.html 最近在做服务器压力测试程序. 接触了一段时间Socket异步通讯,发现自己对BeginRe ...

  2. Eclipse-----解决调试源码不进入断点问题

    1.Window-->Preferences-->Java-->installed JRES   添加Standard VM 添加完成后,如下图 2.右键点击项目-->Prop ...

  3. 【2017-04-17】类库、通用变量、is和as、委托

    类库dll文件,里边有很多被编译后的C#代码,不可阅读,不可修改,只能调用 1.类库创建 新建项目为类库,类库文件编写完成后,选择生成—生成解决方案,在debug文件夹下找到dll文件 2.类库引用 ...

  4. Nexus3.x.x上传第三方jar

    exus3.x.x上传第三方jar: 1. create repository 选择maven2(hosted),说明: proxy:即你可以设置代理,设置了代理之后,在你的nexus中找不到的依赖就 ...

  5. JAVA基础1---Object类解析

    1.Object简介 众所周知,Object类是Java所有类的万类之源,所有Java类都是继承之Object类,而默认就直接忽略了extends Object这段代码. 2.Object类的源码 话 ...

  6. 怎样从外网访问内网MongoDB数据库?

    本地安装了一个MongoDB数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MongoDB数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MongoDB数据库 默认安装 ...

  7. Doing Homework HDU - 1074

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  8. java321 面向对象编程

  9. 保存canvas

    http://www.crazybunqnq.com/2018/09/01/PythonSeleniumSaveCanvas/ http://www.webhek.com/post/save-canv ...

  10. Docker学习笔记之使用 Docker Hub 中的镜像

    0x00 概述 自己编写 Dockerfile 能够很好的实现我们想要的程序运行环境,不过如果装有我们想要环境的镜像已经由热心的开发者构建好并共享在 Docker Hub 上,直接使用它们就会远比自己 ...