【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自动机是干嘛的... 状 ...
随机推荐
- 对象布局已知时 C++ 对象指针的转换时地址调整
在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时 ...
- C#检测网卡和网络统计信息
using System; using System.Collections.Generic; using System.Net.NetworkInformation; public class My ...
- Linux top命令排序
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 Linux 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会以 ...
- 初探VIM编辑器
初探VIM 引言---什么是Vim? 接触Linux这么久,想必对于一切皆文件的哲学思想已经不陌生了.因此,学习并掌握用一款Linux文本编辑器,对于玩转LInux来说,是很有必要的. vi编辑器是U ...
- 使用onclick跳转到其他页面/跳转到指定url
☆如果是本页显示可以直接用location,方法如下: ①onclick="javascript:window.location.href='URL'" ②onclick=&quo ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
- 基本变换(读书笔记5 --- Real-Time rendering)
刚体变换 即变换不改变了被变换顶点之间的距离,以及偏手性(不会让左右手坐标系颠倒). 下面的平移变换.旋转变换即属于刚体变换 平移 从一个位置变到另一个位置可以用平移矩阵T来表示,这个矩阵将一个实体变 ...
- TCP连接的三次握手和四次解散过程
客户端和服务器在使用TCP连接传输数据的过程中,需要经过三次握手建立连接和四次握手断开连接操作. 具体如下图所示 上图描述了TCP连接从建立到断开的详细过程,以下就其中的具体报文细节展开讨论. 在TC ...
- 策略模式(strategy pattern)
策略模式在java集合中的TreeSet和TreeMap中得到了很好的应用,我们可以实现Comparator接口实现Compareto()方法来定义自己的排序规则,然后通过TreeSet,TreeMa ...
- 我个人结合到老师的来理解的——Asp.net Webform的页面生命周期
1.分析请求的资源路径,寻找目录中对应的资源文件,若无法找到资源文件,则返回404错误2.分析资源文件的Page命令,通过Page指令找到代码文件和类 3.将页面文件和类一起编译生成最终的类(仅仅在第 ...