poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11860 | Accepted: 4527 |
Description
Suppose that DNA sequences of a species is a sequence that consist of A, C, T and G,and the length of sequences is a given integer n.
Input
Next m lines each line contain a DNA genetic disease segment, and length of these segments is not larger than 10.
Output
Sample Input
- 4 3
- AT
- AC
- AG
- AA
Sample Output
- 36
几个月没编AC自动机,突然编一下感觉之痛苦。
主要问题一点是fail指针构造时没有即使break掉,另一点是tail标记上传时需要加入一个while循环。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define MAXN 100
- #define MAXT 100
- #define MOD 100000
- typedef long long qword;
- struct trie_node
- {
- int ptr[];
- int fail;
- char w;
- bool tl;
- }trie[MAXT];
- int topt=;
- char str[MAXN];
- void Add_word(char *str)
- {
- int now=;
- int ind;
- while (*str)
- {
- ind=*(str++)-'A';
- if (!trie[now].ptr[ind])
- {
- trie[now].ptr[ind]=++topt;
- trie[topt].w=ind+'A';
- trie[topt].tl=false;
- }
- now=trie[now].ptr[ind];
- }
- trie[now].tl=true;
- }
- int q[MAXN];
- void Build_Ac()
- {
- int head=-,tail=;
- int now,temp;
- int i,j;
- q[]=;
- trie[].fail=;
- while (head<tail)
- {
- now=q[++head];
- for (i=;i<;i++)
- {
- if (!trie[now].ptr[i])continue;
- q[++tail]=trie[now].ptr[i];
- if (now==)
- {
- trie[trie[now].ptr[i]].fail=now;
- continue;
- }
- temp=trie[now].fail;
- while(temp!=)
- {
- if (trie[temp].ptr[i])
- {
- trie[trie[now].ptr[i]].fail=trie[temp].ptr[i];
- break;
- }
- temp=trie[temp].fail;
- }
- if (!trie[trie[now].ptr[i]].fail)
- trie[trie[now].ptr[i]].fail=trie[].ptr[i];
- if (!trie[trie[now].ptr[i]].fail)
- trie[trie[now].ptr[i]].fail=;
- }
- }
- for (i=;i<=topt;i++)
- {
- for (j=;j<;j++)
- {
- if (!trie[i].ptr[j])
- {
- temp=trie[i].fail;
- while (temp!=)
- {
- if (trie[temp].ptr[j])
- {
- trie[i].ptr[j]=trie[temp].ptr[j];
- break;
- }
- temp=trie[temp].fail;
- }
- if (!trie[i].ptr[j])
- trie[i].ptr[j]=trie[].ptr[j];
- if (!trie[i].ptr[j])
- trie[i].ptr[j]=;
- }
- }
- }
- j=;
- while (j--)
- {
- for (i=;i<=tail;i++)
- {
- if (trie[trie[i].fail].tl)
- trie[i].tl=true;
- }
- }
- }
- struct matrix
- {
- int n,m;
- qword a[MAXN][MAXN];
- matrix()
- {
- memset(a,,sizeof(a));
- }
- void pm()
- {
- int i,j;
- for (i=;i<=n;i++)
- {
- for (j=;j<=m;j++)
- {
- printf("% 4d ",a[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- }
- }m1,r1,m2;
- matrix operator *(matrix &m1,matrix &m2)
- {
- if (m1.m!=m2.n)throw ;
- matrix ret;
- ret.n=m1.n;
- ret.m=m2.m;
- int i,j,k;
- for (i=;i<=ret.n;i++)
- {
- for (j=;j<=ret.m;j++)
- {
- for (k=;k<=m1.m;k++)
- {
- ret.a[i][j]=(ret.a[i][j]+m1.a[i][k]*m2.a[k][j])%MOD;
- }
- }
- }
- return ret;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- // freopen("output.txt","w",stdout);
- int n,m,i,j,k,x,y,z;
- scanf("%d%d\n",&m,&n);
- topt=;
- trie[].w='#';
- for (i=;i<m;i++)
- {
- scanf("%s",str);
- x=strlen(str);
- for (j=;j<x;j++)
- {
- switch(str[j])
- {
- case 'A':str[j]='A';break;
- case 'G':str[j]='B';break;
- case 'C':str[j]='C';break;
- case 'T':str[j]='D';break;
- }
- }
- Add_word(str);
- }
- Build_Ac();
- m1.m=m1.n=topt;
- for (i=;i<=topt;i++)
- {
- for (j=;j<;j++)
- {
- if (trie[trie[i].ptr[j]].tl)continue;
- m1.a[trie[i].ptr[j]][i]++;
- }
- }
- // m1.pm();
- m2.m=,m2.n=topt;
- m2.a[][]=;
- while (n)
- {
- if (n&)
- {
- m2=m1*m2;
- }
- m1=m1*m1;
- n>>=;
- }
- /*
- for (i=1;i<=n;i++)
- {
- m2=m1*m2;
- // m2.pm();
- }*/
- qword ans=;
- for (i=;i<=topt;i++)
- {
- ans+=m2.a[i][];
- ans%=MOD;
- }
- printf("%d\n",ans);
- return ;
- }
poj 2778 DNA Sequence AC自动机DP 矩阵优化的更多相关文章
- POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
- poj 2778 DNA Sequence ac自动机+矩阵快速幂
链接:http://poj.org/problem?id=2778 题意:给定不超过10串,每串长度不超过10的灾难基因:问在之后给定的长度不超过2e9的基因长度中不包含灾难基因的基因有多少中? DN ...
- POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种. 思路:用AC自动机,利用AC自动机上的节点做矩阵乘法. #include<iostream> #includ ...
- poj 2778 DNA Sequence AC自动机
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- [POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)
传送门 AC自动机加DP就不说了 注意到 m <= 10,所以模式串很少. 而 n 很大就需要 log 的算法,很容易想到矩阵. 但是该怎么构建? 还是矩阵 A(i,j) = ∑A(i,k) * ...
- POJ 3691 DNA repair(AC自动机+DP)
题目链接 能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的. 做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的... 状 ...
- HDU 2457/POJ 3691 DNA repair AC自动机+DP
DNA repair Problem Description Biologists finally invent techniques of repairing DNA that contains ...
随机推荐
- 基于单个 div 的 CSS 画图
原文: Single Div Drawings with CSS 译文: 基于单个 div 的 CSS 画图 译者: 前端外刊评论 译注:通读本文,强烈地感受到了技术与艺术的结合.赞作者的这句话:Re ...
- Linux模式设计系列( 内核与应用关联思考)
http://blog.chinaunix.net/uid/20608849/cid-25333-list-2.html
- Mysql 进阶操作
将已经存在表设置自动增长属性alter table student change id id int not null auto_increment primary key;(注:这个地方一定是原来就 ...
- ctkPlugin插件系统实现项目插件式开发
插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...
- js验证邮箱
<html> <head> <script> function verifyAddress(obj) { var email = obj ...
- (转载)Eclipse下配置Github环境 .
总的参考文档:EGit User Guide http://wiki.eclipse.org/EGit/User_Guide Address: http://www.linuxidc.com/Linu ...
- hdu2035java
人见人爱A^B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- VC++/MFC操作ini配置文件详解
在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINA ...
- linux下的oracle数据库和表空间的导入导出
由于oracle是安装在linux上面,因此需要oracle的导入导出都是使用命令进行操作.oracle允许整个数据库导入导出和表空间的导入导出. 数据库导入导出 以下操作是在操作系统控制台命令中执行 ...
- [XML] Resource帮助类
点击下载 Resources.rar /// <summary> /// 类说明:Resources /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[u ...