【Luogu】P2536病毒检测(Trie上DP)
这道题我写了个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)的更多相关文章
- luogu 2478 [SDOI2010]城市规划 仙人掌上dp.
LINK:城市规划 以前ls 让写的时候由于看不懂题目+以为在图中的环上dp非常困难所以放弃治疗了. 现在终于能把题目看懂了 泪目... 题目其实就是在说 给出一张图这个有一个非常好的性质 满足每个点 ...
- BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)
bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...
- 用 Python 和 OpenCV 检测图片上的条形码
用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...
- Telnet命令检测远程主机上的端口是否开启
ping命令不能检测端口,只能检测你和相应IP是否能连通. 本地虚拟机里安装了一个Ubuntu,使用Putty连接22端口操作时提示失败,于是查看对应端口是否开启. Windows下要检测远程主机上的 ...
- 一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码
计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别.行人检测等,国内的旷视科技.商汤科技等公司在该领域占据行业领先地位.相对于图像分类任务而言,目标检测会更加复杂一些,不 ...
- 2019.4.11 一题 XSY 1551 ——广义后缀数组(trie上后缀数组)
参考:http://www.mamicode.com/info-detail-1949898.html (log2) https://blog.csdn.net/geotcbrl/article/de ...
- 【BZOJ1966】[AHOI2005]病毒检测(动态规划)
[BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...
- 用 Python 和 OpenCV 检测图片上的条形码(转载)
原文地址:http://python.jobbole.com/80448/ 假设我们要检测下图中的条形码: # load the image and convert it to grayscale 1 ...
随机推荐
- spring security 2.x HttpSessionEventPublisher 以及listener配置
在环境为spring security2.x时 *JDK6 spring 2* 正确的filter路径是:org.springframework.security.ui.session.HttpSes ...
- UVA11019 Matrix Matcher (AC自动机)
二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断). 把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一.最后统计总数. 因为所有模式串长度一样,不用维护last数组 ...
- [CV笔记]OpenCV机器学习笔记
KNN算法: 目的是分类,具体过程为,先训练,这个训练我估计只是对训练数据进行一个存储,knn测试的过程是根据测试样例找出与这个样例的距离最近的k个点,看这k个点中哪个分类所占的比例比较多,那么这个样 ...
- 团队作业-Beta冲刺(周三)
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作业要求在哪里 https://edu.cnblo ...
- 2018.2.10 使用SSH连接远程滴滴云服务器Ubuntu (Windows下) 及 putty工具永久设置字体、颜色
一开始会有人问云服务器是什么? 云服务器是一种类似VPS服务器的虚拟化技术, VPS是采用虚拟软件,VZ或VM在一台服务器上虚拟出多个类似独立服务器的部分,每个部分都可以做单独的操作系统,管理方法同服 ...
- vs 2012打开vs2013的sln
Project -> Properties -> General -> Platform Toolset (as IInspectable correctly commented)
- 采用maven 对tomcat 进行自动部署
在工作过程中经常会遇到项目频繁发不到额过程,而且在这个过程中会一直进行一些简单但是繁琐的重复性工程 1.打war 包 2.停掉tomcat 3.copy war 包 4.启动tomcat 听说mave ...
- 共享服务-FTP基础(一)
介绍:文件传输协议FTP 两种模式:服务器角度 主动(PORT style):服务器主动连接 命令(控制):客户端:随机port --- 服务器:tcp21 数据:客户端:随机port ---服务 ...
- LeetCode1089复写零
问题: 给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移. 注意:请不要在超过该数组长度的位置写入元素. 要求:请对输入的数组 就地 进行上述修改,不要 ...
- STA basic