【POJ2778】DNA Sequence(AC自动机,DP)
题意:
生物课上我们学到,DNA序列中只有A, C, T和G四种片段。
经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段”ATC”是不好片段,则”AGATCC”, “CATCAA”, “ATCATC”都是不好的DNA序列,这些不好片段我们可以称为病毒片段。
现在已知m个病毒片段, 问长度为n的DNA序列,有多少种可能不包含病毒片段。答案可能很大,取模 100000。
【数据规模和约定】
0<=m<=10 病毒片段长度不超过10,只含A,T,C,G字母
1<=n<=2000000000
思路:AC自动机
因为fail[i]一定是i的一个前缀的后缀,fail[i]如果带病毒i必定带病毒
转移:
{ dp[0,1]:=1; for i:=1 to m do for eachedge(i,j) begin dp[i,j]:=dp[i,j]+dp[i-1,i]; end; }const mo=;
type arr=array[..,..]of int64;
var y,c,ans,d:arr;
s:array[..]of char;
map:array[..,'A'..'Z']of longint;
f,b,q:array[..]of longint;
m,n,i,j,k,t,sum,num:longint;
ch:string; procedure build;
var i,k,d:longint;
begin
k:=; d:=length(ch);
for i:= to d do
begin
if map[k,ch[i]]= then begin inc(num); map[k,ch[i]]:=num; end;
k:=map[k,ch[i]];
end;
b[k]:=;
end; procedure acauto;
var t,w,i,u,p,son:longint;
begin
t:=; w:=; q[]:=;
while t<w do
begin
inc(t); u:=q[t];
for i:= to do
if map[u,s[i]]> then
begin
son:=map[u,s[i]];
p:=f[u];
if u= then f[son]:=
else f[son]:=map[p,s[i]];
inc(w); q[w]:=son;
end
else
begin
p:=f[u];
if u= then map[u,s[i]]:=
else map[u,s[i]]:=map[p,s[i]];
end;
end;
end; begin
assign(input,'poj2778.in'); reset(input);
assign(output,'poj2778.out'); rewrite(output);
readln(m,n);
num:=;
s[]:='A'; s[]:='C'; s[]:='G'; s[]:='T';
for i:= to m do
begin
readln(ch);
build;
end;
acauto;
for i:= to num do
if b[f[i]]= then b[i]:=; for i:= to num do
if b[i]= then
for j:= to do
if b[map[i,s[j]]]= then inc(d[i,map[i,s[j]]]); t:=n;
for i:= to num do ans[i,i]:=;
y:=d;
while t> do
begin
if t and = then
begin
for i:= to num do
for j:= to num do c[i,j]:=;
for i:= to num do
for k:= to num do
begin
for j:= to num do c[i,k]:=c[i,k]+ans[i,j]*y[j,k];
c[i,k]:=c[i,k] mod mo;
end;
for i:= to num do
for j:= to num do ans[i,j]:=c[i,j];
end;
for i:= to num do
for j:= to num do c[i,j]:=;
for i:= to num do
for k:= to num do
begin
for j:= to num do c[i,k]:=c[i,k]+y[i,j]*y[j,k];
c[i,k]:=c[i,k] mod mo;
end;
for i:= to num do
for j:= to num do y[i,j]:=c[i,j];
t:=t>>;
end;
for i:= to num do sum:=(sum+ans[,i]) mod mo;
writeln(sum); close(input);
close(output);
end.
【POJ2778】DNA Sequence(AC自动机,DP)的更多相关文章
- poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- [poj2778]DNA Sequence(AC自动机+矩阵快速幂)
题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) 解题关键:AC自动机,实际上就是一个状态转移图,注意能少取模就少取模, ...
- poj2778 DNA Sequence(AC自动机+矩阵快速幂)
Description It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's ve ...
- POJ2778 DNA Sequence(AC自动机 矩阵)
先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数. #include<cstdio& ...
- [poj2778 DNA Sequence]AC自动机,矩阵快速幂
题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...
- POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...
- POJ2278 DNA Sequence —— AC自动机 + 矩阵优化
题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Tota ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
- 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)
已经128天了?怎么觉得上次倒计时150天的日子还很近啊 ....好吧为了把AC自动机搞透我也是蛮拼的..把1030和这道题对比了无数遍...最终结论是...无视时间复杂度,1030可以用这种写法解. ...
- POJ 3691 DNA repair(AC自动机+DP)
题目链接 能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的. 做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的... 状 ...
随机推荐
- beagleBone black 中QT的移植
收到板子后默认是Debian系统.gcc -v 后发现其编译链是:arm-linux-gnueabihf http://pan.baidu.com/s/1pJrAvsn 有相关工具下载,里面有这个 解 ...
- js疑问
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];var aCopy = arr.slice();aCopy; // ['A', 'B', 'C', 'D', ...
- UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?
其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...
- extentreports报告插件与testng集成(二)
之前的一篇文章中,是把extentreports 的报告的初始方法写在driver的初始方法中,写报告的方法在testng的 onTest中,这次将这些方法全都拆出来,写在一个方法类中,这个类重现实现 ...
- Javascript猜数字游戏
<!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...
- 表中排序ID断开重排
客户需要排序ID和页面的问题序号一致,以前删除过一些问题导致order_id 中间有些断开的. 业务表 T_QUESTION order_id question_id custom_id --1.创 ...
- FreeMark学习(一)
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMark ...
- Android IOS WebRTC 音视频开发总结(八十一)-- WebRTC靠谱吗?有没有适合的SDK推荐?
作者:blaker,最早发表在我们的微信公众和[编风网],详见[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn) ...
- 主机WIFI网络环境下,Linux虚拟机网络设置
在主机使用WIFI网络环境下,怎么样进行虚拟机静态ip设置和连接互联网呢,原理什么太麻烦,另类的网络共享而已: 1.其实简单将网络连接模式设置成NAT模式即可. 2.虚拟网络编辑器依旧是桥接模式,选择 ...
- shell 脚本,提取文件中的内容
使用awk.cut.sed.if.while 等 awk.cut.sed还是很重要的 这是后来修改的,可以完成 #!/bin/bash #conver formatFILE=mobile_dpi.ru ...