题目链接

  这道题我写了个01DP,f[i][j]表示跑到Trie上第i个节点,匹配到字符串第j位行不行

  然后重点在*号无限匹配怎么处理

  经过一番脑洞我们可以发现*号无限匹配可以拆成两种情况:

  1:匹配数无条件+1,但是字符串仍然匹配到底j位

  2:直接跳过去了qwq

  对应设计状态转移方程就好了

  然后这个算法……我卡时卡空间勉强过

  卡时不知道怎么办……也许能循环展开什么的?

  卡空间的话,可以设滚动数组。

  f[i][j]中的i不再代表Trie上第i个节点,而是代表深度第i层的节点

  DP的时候用dfs的方法DP,DP完了统计一下就可以把原来叶子占用的空间清掉腾给别人

  Orz rqy,这真是个神办法

  

// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<queue>
#define maxn 505
#define maxl 1020
using namespace std;
int tree[maxn*maxn][],tot;
int fail[maxn*maxn];
char s[maxl];
char c[maxl];
int pnt[maxn];
bool f[][maxn]; inline int count(char i){
if(i=='A') return ;
if(i=='T') return ;
if(i=='C') return ;
if(i=='G') return ;
if(i=='*') return ;
return ;
} void update(int x){
int n=strlen(c+),now=;
for(int i=;i<=n;++i){
if(tree[now][count(c[i])]==) tree[now][count(c[i])]=++tot;
now=tree[now][count(c[i])];
}
pnt[x]=now;
return;
} void makefail(){
queue<int>q;
for(int i=;i<;++i)
if(tree[][i]) q.push(tree[][i]);
while(!q.empty()){
int from=q.front(); q.pop();
for(int i=;i<;++i){
int &now=tree[from][i];
if(now==){
now=tree[fail[from]][i];
continue;
}
fail[now]=tree[fail[from]][i];
q.push(now);
}
}
return;
} int main(){
scanf("%s",s+);int len=strlen(s+);
int n; scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%s",c+);
update(i);
}
//makefail();
f[][]=;
for(int i=;i<=tot;++i){
for(register int j=;j<len;++j){
if(s[j+]=='A') if(tree[i][]) f[tree[i][]][j+]|=f[i][j];
if(s[j+]=='T') if(tree[i][]) f[tree[i][]][j+]|=f[i][j];
if(s[j+]=='C') if(tree[i][]) f[tree[i][]][j+]|=f[i][j];
if(s[j+]=='G') if(tree[i][]) f[tree[i][]][j+]|=f[i][j];
if(s[j+]=='?')
for(int k=;k<;++k)
if(tree[i][k]) f[tree[i][k]][j+]|=f[i][j];
if(s[j+]=='*'){
f[i][j+]|=f[i][j];
for(int k=;k<;++k)
if(tree[i][k]) f[tree[i][k]][j]|=f[i][j];
}
}
for(int j=;j<;++j) f[tree[i][j]][len]|=f[i][len];
}
int ans=n;
for(int i=;i<=n;++i)
if(f[pnt[i]][len]==) ans--;
printf("%d\n",ans);
return ;
} /*
A*G?C
3
AGTC
AGTGTC
AGTGC
*/

【Luogu】P2536病毒检测(Trie上DP)的更多相关文章

  1. luogu 2478 [SDOI2010]城市规划 仙人掌上dp.

    LINK:城市规划 以前ls 让写的时候由于看不懂题目+以为在图中的环上dp非常困难所以放弃治疗了. 现在终于能把题目看懂了 泪目... 题目其实就是在说 给出一张图这个有一个非常好的性质 满足每个点 ...

  2. BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索

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

  3. bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)

    bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...

  4. 用 Python 和 OpenCV 检测图片上的条形码

      用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...

  5. Telnet命令检测远程主机上的端口是否开启

    ping命令不能检测端口,只能检测你和相应IP是否能连通. 本地虚拟机里安装了一个Ubuntu,使用Putty连接22端口操作时提示失败,于是查看对应端口是否开启. Windows下要检测远程主机上的 ...

  6. 一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码

    计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别.行人检测等,国内的旷视科技.商汤科技等公司在该领域占据行业领先地位.相对于图像分类任务而言,目标检测会更加复杂一些,不 ...

  7. 2019.4.11 一题 XSY 1551 ——广义后缀数组(trie上后缀数组)

    参考:http://www.mamicode.com/info-detail-1949898.html (log2) https://blog.csdn.net/geotcbrl/article/de ...

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

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

  9. 用 Python 和 OpenCV 检测图片上的条形码(转载)

    原文地址:http://python.jobbole.com/80448/ 假设我们要检测下图中的条形码: # load the image and convert it to grayscale 1 ...

随机推荐

  1. 使用ABAP代码提交SAP CRM Survey调查问卷

    Jerry之前曾经写过两篇关于SAP CRM Survey调查问卷的技术文章: SAP CRM Survey调查问卷的模型设计原理解析 如何使用SAP CRM Marketing Survey创建一个 ...

  2. QT 调试输出格式

    Qt调试输出格式: 1,qDebug() << qPrintable(firstNode.nodeName()) << qPrintable(firstNode.nodeVal ...

  3. Dojo中的选择器

    dom.byId(以前的dojo.byId):等同于js中的document.getElementById. http://www.cnblogs.com/tiandi/archive/2013/11 ...

  4. javaweb基础(7)_HttpServletResponse原理详解

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  5. oracle 快速复制一张表,并在此创建索引,日志及并行度

    复制表结构及其数据 create table table_name_new as select * from table_name_old 只复制表结构 create table table_name ...

  6. Java开发小游戏 用键盘控制精灵在游戏中上下左右跑动 窗体小游戏可打包下载,解压后双击start运行

    package com.swift; import java.awt.Point; import java.awt.event.KeyEvent; import com.rupeng.game.Gam ...

  7. Codevs1081 线段树练习 2

    题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...

  8. Protobuf有没有比JSON快5倍?用代码来击破pb性能神话

    转 http://www.sohu.com/a/136487507_505779 2017-04-26 07:58 程序设计 /58 /技术 导读:Google 的 Protocol Buffers ...

  9. spring IOC注解与xml配置

    转载自:https://blog.csdn.net/u014292162/article/details/52277756 IOC 1小案例 将对象的依赖交给配置文件来配置(配置文件的名字是可以任意的 ...

  10. Python入门:Python基础笔记

    (C语言:)C语言是相对C++.C#.Java等语言更接近底层,并且一些硬件编程都可以使(只能使用)C语言.另外C语言学起来相对困难,因为涉及到指针,指针也是语言接近底层语言的一个特征.目前编写较大的 ...