题意:

生物课上我们学到,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)的更多相关文章

  1. poj 2778 DNA Sequence AC自动机DP 矩阵优化

    DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11860   Accepted: 4527 Des ...

  2. [poj2778]DNA Sequence(AC自动机+矩阵快速幂)

    题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) 解题关键:AC自动机,实际上就是一个状态转移图,注意能少取模就少取模, ...

  3. 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 ...

  4. POJ2778 DNA Sequence(AC自动机 矩阵)

    先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数. #include<cstdio& ...

  5. [poj2778 DNA Sequence]AC自动机,矩阵快速幂

    题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...

  6. POJ 2778 DNA Sequence (AC自动机+DP+矩阵)

    题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...

  7. POJ2278 DNA Sequence —— AC自动机 + 矩阵优化

    题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  8. POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )

    题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...

  9. 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)

    已经128天了?怎么觉得上次倒计时150天的日子还很近啊 ....好吧为了把AC自动机搞透我也是蛮拼的..把1030和这道题对比了无数遍...最终结论是...无视时间复杂度,1030可以用这种写法解. ...

  10. POJ 3691 DNA repair(AC自动机+DP)

    题目链接 能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的. 做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的... 状 ...

随机推荐

  1. iOS开发之CocoaPods的使用

    你开发iOS的方式还是石器时代吗?在这个世界上并不是所有的软件开发人员都是码农.在这个世界上有很多的geek存在他们为这个语言的发展做出了很大的贡献.现在随着iOS开发者的曾多也就出现了iOS程序猿提 ...

  2. 黑马程序员_ C语言基础之指针(三)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...

  3. Proe Top-Down设计演示

    前段时间有网友问我,proe 里面有没有装配设计中当某一零件尺寸需要修改时, 与其相关的零件尺寸都需要随之做相应改变的法子.我认为top-down是很好的选择. 下面介绍一下top-down的理论: ...

  4. 浅谈oracle10G spfile与pfile(转)

    转自:http://blog.csdn.net/onebigday/article/details/6108348,http://www.linuxidc.com/Linux/2012-11/7371 ...

  5. c# 利用结构体获取json数据

    最近做微信支付,要获取用户的openid,调用接口后返回的是json格式的数据,我想在c#后台把数据逐一取出,网上查了查,找到以下方法: 1.首先调用接口,要有一个post数据到指定url并返回数据的 ...

  6. Linux 显示文件完整路径

    原链接 http://blog.chinaunix.net/uid-25266990-id-3268759.html ls foo | sed "s:^:`pwd`/:"

  7. Linux CentOS6.8下解压安装mysql-5.7.14完整介绍

    环境:centos6.8 32位本教程安装MySQL是通过编译过的二进制文件进行安装.是不针对特定平台的通用安装方法,使用的二进制文件是后缀为.tar.gz的压缩文件1.下载 http://dev.m ...

  8. CocoaPods安装记录

    1. ruby版本过低的解决方法 查看ruby版本:$ruby -v 终端会输出你的ruby 版本信息 查看目前的所有ruby版本:$rvm list known 安装ruby版本:$rvm inst ...

  9. web----test-----selenium

    selenium ide 安装就自行百度吧. 对百度进行一个简单的录制. 1. 在Firefox浏览器打开百度页面. 2.在Firefox浏览器菜单栏中,选择“工具” ,选择selenium IDE ...

  10. mouseover和mouseout、mouseenter和mouseleave

    又一个傻傻分不清楚的东东~ 现实真是一个问题天天有的世界~本以为我对js中的事件还是比较了解的,对于早就接触的mouse事件,更是觉得得心应手了~但是现实却给了我一记重拳! 我自身工作中遇到的犯二的故 ...