DNA Sequence

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 11860   Accepted: 4527

Description

It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to analyze a segment of DNA Sequence,For example, if a animal's DNA sequence contains segment ATC then it may mean that the animal may have a genetic disease. Until now scientists have found several those segments, the problem is how many kinds of DNA sequences of a species don't contain those segments.

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

First line contains two integer m (0 <= m <= 10), n (1 <= n <=2000000000). Here, m is the number of genetic disease segment, and n is the length of sequences.

Next m lines each line contain a DNA genetic disease segment, and length of these segments is not larger than 10.

Output

An integer, the number of DNA sequences, mod 100000.

Sample Input

  1. 4 3
  2. AT
  3. AC
  4. AG
  5. AA

Sample Output

  1. 36

  几个月没编AC自动机,突然编一下感觉之痛苦。

  主要问题一点是fail指针构造时没有即使break掉,另一点是tail标记上传时需要加入一个while循环。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAXN 100
  7. #define MAXT 100
  8. #define MOD 100000
  9. typedef long long qword;
  10.  
  11. struct trie_node
  12. {
  13. int ptr[];
  14. int fail;
  15. char w;
  16. bool tl;
  17. }trie[MAXT];
  18. int topt=;
  19. char str[MAXN];
  20. void Add_word(char *str)
  21. {
  22. int now=;
  23. int ind;
  24. while (*str)
  25. {
  26. ind=*(str++)-'A';
  27. if (!trie[now].ptr[ind])
  28. {
  29. trie[now].ptr[ind]=++topt;
  30. trie[topt].w=ind+'A';
  31. trie[topt].tl=false;
  32. }
  33. now=trie[now].ptr[ind];
  34. }
  35. trie[now].tl=true;
  36. }
  37. int q[MAXN];
  38. void Build_Ac()
  39. {
  40. int head=-,tail=;
  41. int now,temp;
  42. int i,j;
  43. q[]=;
  44. trie[].fail=;
  45. while (head<tail)
  46. {
  47. now=q[++head];
  48. for (i=;i<;i++)
  49. {
  50. if (!trie[now].ptr[i])continue;
  51. q[++tail]=trie[now].ptr[i];
  52. if (now==)
  53. {
  54. trie[trie[now].ptr[i]].fail=now;
  55. continue;
  56. }
  57. temp=trie[now].fail;
  58. while(temp!=)
  59. {
  60. if (trie[temp].ptr[i])
  61. {
  62. trie[trie[now].ptr[i]].fail=trie[temp].ptr[i];
  63. break;
  64. }
  65. temp=trie[temp].fail;
  66. }
  67. if (!trie[trie[now].ptr[i]].fail)
  68. trie[trie[now].ptr[i]].fail=trie[].ptr[i];
  69. if (!trie[trie[now].ptr[i]].fail)
  70. trie[trie[now].ptr[i]].fail=;
  71. }
  72. }
  73. for (i=;i<=topt;i++)
  74. {
  75. for (j=;j<;j++)
  76. {
  77. if (!trie[i].ptr[j])
  78. {
  79. temp=trie[i].fail;
  80. while (temp!=)
  81. {
  82. if (trie[temp].ptr[j])
  83. {
  84. trie[i].ptr[j]=trie[temp].ptr[j];
  85. break;
  86. }
  87. temp=trie[temp].fail;
  88. }
  89. if (!trie[i].ptr[j])
  90. trie[i].ptr[j]=trie[].ptr[j];
  91. if (!trie[i].ptr[j])
  92. trie[i].ptr[j]=;
  93. }
  94. }
  95. }
  96. j=;
  97. while (j--)
  98. {
  99. for (i=;i<=tail;i++)
  100. {
  101. if (trie[trie[i].fail].tl)
  102. trie[i].tl=true;
  103. }
  104. }
  105. }
  106. struct matrix
  107. {
  108. int n,m;
  109. qword a[MAXN][MAXN];
  110. matrix()
  111. {
  112. memset(a,,sizeof(a));
  113. }
  114. void pm()
  115. {
  116. int i,j;
  117. for (i=;i<=n;i++)
  118. {
  119. for (j=;j<=m;j++)
  120. {
  121. printf("% 4d ",a[i][j]);
  122. }
  123. printf("\n");
  124. }
  125. printf("\n");
  126. }
  127. }m1,r1,m2;
  128. matrix operator *(matrix &m1,matrix &m2)
  129. {
  130. if (m1.m!=m2.n)throw ;
  131. matrix ret;
  132. ret.n=m1.n;
  133. ret.m=m2.m;
  134. int i,j,k;
  135. for (i=;i<=ret.n;i++)
  136. {
  137. for (j=;j<=ret.m;j++)
  138. {
  139. for (k=;k<=m1.m;k++)
  140. {
  141. ret.a[i][j]=(ret.a[i][j]+m1.a[i][k]*m2.a[k][j])%MOD;
  142. }
  143. }
  144. }
  145. return ret;
  146. }
  147.  
  148. int main()
  149. {
  150. freopen("input.txt","r",stdin);
  151. // freopen("output.txt","w",stdout);
  152. int n,m,i,j,k,x,y,z;
  153. scanf("%d%d\n",&m,&n);
  154. topt=;
  155. trie[].w='#';
  156. for (i=;i<m;i++)
  157. {
  158. scanf("%s",str);
  159. x=strlen(str);
  160. for (j=;j<x;j++)
  161. {
  162. switch(str[j])
  163. {
  164. case 'A':str[j]='A';break;
  165. case 'G':str[j]='B';break;
  166. case 'C':str[j]='C';break;
  167. case 'T':str[j]='D';break;
  168. }
  169. }
  170. Add_word(str);
  171. }
  172. Build_Ac();
  173. m1.m=m1.n=topt;
  174. for (i=;i<=topt;i++)
  175. {
  176. for (j=;j<;j++)
  177. {
  178. if (trie[trie[i].ptr[j]].tl)continue;
  179. m1.a[trie[i].ptr[j]][i]++;
  180. }
  181. }
  182. // m1.pm();
  183. m2.m=,m2.n=topt;
  184. m2.a[][]=;
  185. while (n)
  186. {
  187. if (n&)
  188. {
  189. m2=m1*m2;
  190. }
  191. m1=m1*m1;
  192. n>>=;
  193. }
  194. /*
  195. for (i=1;i<=n;i++)
  196. {
  197. m2=m1*m2;
  198. // m2.pm();
  199. }*/
  200. qword ans=;
  201. for (i=;i<=topt;i++)
  202. {
  203. ans+=m2.a[i][];
  204. ans%=MOD;
  205. }
  206. printf("%d\n",ans);
  207. return ;
  208. }

poj 2778 DNA Sequence AC自动机DP 矩阵优化的更多相关文章

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

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

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

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

  3. poj 2778 DNA Sequence ac自动机+矩阵快速幂

    链接:http://poj.org/problem?id=2778 题意:给定不超过10串,每串长度不超过10的灾难基因:问在之后给定的长度不超过2e9的基因长度中不包含灾难基因的基因有多少中? DN ...

  4. POJ 2778 DNA Sequence (AC自动机,矩阵乘法)

    题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种. 思路:用AC自动机,利用AC自动机上的节点做矩阵乘法. #include<iostream> #includ ...

  5. poj 2778 DNA Sequence AC自动机

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

  6. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  7. [POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)

    传送门 AC自动机加DP就不说了 注意到 m <= 10,所以模式串很少. 而 n 很大就需要 log 的算法,很容易想到矩阵. 但是该怎么构建? 还是矩阵 A(i,j) = ∑A(i,k) * ...

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

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

  9. HDU 2457/POJ 3691 DNA repair AC自动机+DP

    DNA repair Problem Description   Biologists finally invent techniques of repairing DNA that contains ...

随机推荐

  1. 基于单个 div 的 CSS 画图

    原文: Single Div Drawings with CSS 译文: 基于单个 div 的 CSS 画图 译者: 前端外刊评论 译注:通读本文,强烈地感受到了技术与艺术的结合.赞作者的这句话:Re ...

  2. Linux模式设计系列( 内核与应用关联思考)

    http://blog.chinaunix.net/uid/20608849/cid-25333-list-2.html

  3. Mysql 进阶操作

    将已经存在表设置自动增长属性alter table student change id id int not null auto_increment primary key;(注:这个地方一定是原来就 ...

  4. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  5. js验证邮箱

    <html>    <head>    <script>   function verifyAddress(obj)    {    var email = obj ...

  6. (转载)Eclipse下配置Github环境 .

    总的参考文档:EGit User Guide http://wiki.eclipse.org/EGit/User_Guide Address: http://www.linuxidc.com/Linu ...

  7. hdu2035java

    人见人爱A^B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. VC++/MFC操作ini配置文件详解

    在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINA ...

  9. linux下的oracle数据库和表空间的导入导出

    由于oracle是安装在linux上面,因此需要oracle的导入导出都是使用命令进行操作.oracle允许整个数据库导入导出和表空间的导入导出. 数据库导入导出 以下操作是在操作系统控制台命令中执行 ...

  10. [XML] Resource帮助类

    点击下载 Resources.rar /// <summary> /// 类说明:Resources /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[u ...