欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1966


题意概括

  现在有一些串和一个病毒模板。让你统计非病毒串的总数。串个数<=500。

  串由'A' 'C' 'G' 'T'构成,长度<=500。

  病毒模板(长度<=1000)较为复杂,由'A' 'C' 'G' 'T' '*' '?'组成。其中'A' 'C' 'G' 'T'没有特异功能。但是'*' 和 '?'有特意功能:

  '*':在这里可以填充任意长度的任意串(由A,C,G,T组成,长度可以为0)。

  '?':在这里能且仅能填一个字母,这个字母在A,C,G,T中选。

  如果病毒模板通过在'.'和'?'中填字母可以做到和某一个串相同,那么这个串就是病毒串。反之就是非病毒串。


题解

  我们发现连续的'*'是没用的可以压成一个'*',花几行代码压掉。

  然后对于每一个串,我们跑一个二维的dp。

  用f[i][j]表示从病毒串的第i位开始,当前串的第j位开始,能否得到匹配。

  那么有3种转移:

  1. 当前模板位为‘*’,那么我们可以考虑结束'*'或者继续匹配当前串,故f[i][j]=f[i][j+1] or f[i+1][j]

  2. 当前模板位为'?',那么我们只能做到和当前字符匹配,故f[i][j]=f[i+1][j+1]

  3. 当前模板位为字符,那么我判断一下和当前串位是否相同,如果不同那么f[i][j]=0,否则f[i][j]=f[i+1][j+1]

  注意特殊情况:

  最后的时候,模板串还有'*',但是当前串已经匹配完的情况要注意一下。

  dp主体写在dfs里面。


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int M=1005,N=505;
int t,n,m,ans=0,f[M][N];
char str[M],ch[N];
void recreate(){
int m_=1;
for (int i=2;i<=m;i++)
if (!(str[i]==str[i-1]&&str[i]=='*'))
str[++m_]=str[i];
m=m_;
}
bool dfs(int x,int y){
if (~f[x][y])
return f[x][y];
if (x>m&&y>n)
return f[x][y]=1;
if (str[x]=='*'&&y>n)
return f[x][y]=dfs(x+1,y);
if (x>m||y>n)
return f[x][y]=0;
if (str[x]=='?')
return f[x][y]=dfs(x+1,y+1);
if (str[x]=='*')
return f[x][y]=dfs(x,y+1)||dfs(x+1,y);
if (str[x]!=ch[y])
return f[x][y]=0;
return f[x][y]=dfs(x+1,y+1);
}
int main(){
scanf("%s",str+1);
m=strlen(str+1);
recreate();
scanf("%d",&t);
for (int i=1;i<=t;i++){
scanf("%s",ch+1);
n=strlen(ch+1);
memset(f,-1,sizeof f);
if (!dfs(1,1))
ans++;
}
printf("%d",ans);
return 0;
}

  

最新文章

  1. 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc
  2. javascript里for循环的一些事情
  3. CentOS下Red5安装
  4. P4factory 运行结果展示 basic_routing 以及 ./run_all_tests 的运行结果
  5. Xilium.CefGlue怎么使用Js调用C#方法
  6. 减少远程ssh的延迟
  7. Java中Scanner类
  8. 文件IO 练习题
  9. 不用Google Adsense的84个赚钱方法
  10. Windows API 之 VirtualAlloc
  11. 940B Our Tanya is Crying Out Loud
  12. TP5模型关联问题
  13. .NET Core: 在.NET Core中进行单元测试
  14. 浅谈requireJS 摘自http://www.cnblogs.com/giggle/p/5436710.html
  15. Apache和Nginx运行原理解析
  16. Java基础4-面向对象概述;super();this()
  17. Linux下配置环境变量—— .bashrc 和 /etc/profile
  18. Metrics.NET step by step使用Metrics监控应用程序的性能
  19. oracle a:=100 和 b=:c 区别
  20. hdu 5692(dfs+线段树) Snacks

热门文章

  1. android app与服务器交互
  2. Java EE之 Hibernate 5.x版本中SchemaExport的用法
  3. luogu P4744 [Wind Festival]Iron Man
  4. Django搭建简易博客教程(四)-Models
  5. adb查看安卓设备系统Android版本
  6. 一:对程序员来说CPU是什么?
  7. vue UI框架
  8. SpringBoot注解把配置文件自动映射到属性和实体类实战
  9. log4j2使用入门(二)——与不同日志框架的适配
  10. 嵌入式系统C编程之堆栈回溯