博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Luogu】P2536病毒检测(Trie上DP)
阅读量:4499 次
发布时间:2019-06-08

本文共 1544 字,大约阅读时间需要 5 分钟。

  

  这道题我写了个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
#include
#include
#include
#include
#include
#define maxn 505#define maxl 1020using namespace std;int tree[maxn*maxn][10],tot;int fail[maxn*maxn];char s[maxl];char c[maxl];int pnt[maxn];bool f[200000][maxn];inline int count(char i){ if(i=='A') return 0; if(i=='T') return 1; if(i=='C') return 2; if(i=='G') return 3; if(i=='*') return 4; return 5;}void update(int x){ int n=strlen(c+1),now=0; for(int i=1;i<=n;++i){ if(tree[now][count(c[i])]==0) tree[now][count(c[i])]=++tot; now=tree[now][count(c[i])]; } pnt[x]=now; return;}void makefail(){ queue
q; for(int i=0;i<6;++i) if(tree[0][i]) q.push(tree[0][i]); while(!q.empty()){ int from=q.front(); q.pop(); for(int i=0;i<6;++i){ int &now=tree[from][i]; if(now==0){ now=tree[fail[from]][i]; continue; } fail[now]=tree[fail[from]][i]; q.push(now); } } return;}int main(){ scanf("%s",s+1);int len=strlen(s+1); int n; scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%s",c+1); update(i); } //makefail(); f[0][0]=1; for(int i=0;i<=tot;++i){ for(register int j=0;j

 

转载于:https://www.cnblogs.com/cellular-automaton/p/8711084.html

你可能感兴趣的文章
小div在大div中垂直居中,以及div在页面垂直居中
查看>>
有用的导航栏代码
查看>>
语法错误 : 缺少“;”(在“*”的前面) 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int...
查看>>
2015Web前端攻城之路
查看>>
推荐一个算法网站
查看>>
Python操作MySQL+Redis+MongoDB
查看>>
2017.6.30 Note replace innerHTML split() join()
查看>>
过滤关键词(中间有空格一样过滤)
查看>>
sql 当重复的数据有多条时,保留一条,删除其他重复
查看>>
RFC 4627 JSON
查看>>
Django入门与实践
查看>>
一些面试题(3)
查看>>
算法一枚
查看>>
Spin lock 与mutex 的区别--2011.01.06
查看>>
Java resources
查看>>
python--异常处理
查看>>
MongoDB 之 你得知道MongoDB是个什么鬼 MongoDB - 1
查看>>
数论只会GCD。。。
查看>>
UVA 12506 Shortest Names
查看>>
利用 jQuery 来验证密码两次输入是否相同
查看>>