题目链接:http://poj.org/problem?id=2778

题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列。(仅含A,T,C,G四个字符)

思路:Trie图的状态转移,用矩阵mat[i][j]来表示从结点i到j只走一步有几种走法,那么mat的n次幂就表示从结点i到j走n步有几种走法,题目要求解的就是从头节点走n步且不包含危险结点的走法。

mat = mat^n   ans = (mat[0][0] + mat[0][1] + ... + mat[0][num]) num为结点个数

code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <map>
  5. using namespace std;
  6. const int KIND = ;
  7. const int MAXN = ;
  8. const int MOD = ;
  9. typedef long long LL;
  10.  
  11. struct Trie
  12. {
  13. int next[MAXN][KIND], fail[MAXN];
  14. bool isExit[MAXN];
  15. int root, L;
  16. map<char, int> mp;
  17. LL mat[MAXN][MAXN];
  18. LL ret[MAXN][MAXN];
  19. LL tmp[MAXN][MAXN];
  20. int create()
  21. {
  22. for (int i = ; i < KIND; ++i)
  23. next[L][i] = -;
  24. isExit[L++] = false;
  25. return L - ;
  26. }
  27. void init()
  28. {
  29. L = ;
  30. root = create();
  31. mp['A'] = ;
  32. mp['C'] = ;
  33. mp['G'] = ;
  34. mp['T'] = ;
  35. memset(mat, , sizeof(mat));
  36. memset(ret, , sizeof(ret));
  37. }
  38. void insert(char str[])
  39. {
  40. int now = root;
  41. int len = strlen(str);
  42. for (int i = ; i < len; ++i)
  43. {
  44. if (- == next[now][mp[str[i]]])
  45. next[now][mp[str[i]]] = create();
  46. now = next[now][mp[str[i]]];
  47. }
  48. isExit[now] = true;
  49. }
  50. void build()
  51. {
  52. queue<int>Q;
  53. for (int i = ; i < KIND; ++i)
  54. {
  55. if (- == next[root][i])
  56. next[root][i] = root;
  57. else
  58. {
  59. fail[next[root][i]] = root;
  60. Q.push(next[root][i]);
  61. }
  62. }
  63. while (!Q.empty())
  64. {
  65. int now = Q.front();
  66. Q.pop();
  67. if (isExit[fail[now]])
  68. isExit[now] = true;
  69. for (int i = ; i < KIND; ++i)
  70. {
  71. if (- == next[now][i])
  72. next[now][i] = next[fail[now]][i];
  73. else
  74. {
  75. fail[next[now][i]] = next[fail[now]][i];
  76. Q.push(next[now][i]);
  77. }
  78. }
  79. }
  80. }
  81. void getMatrix()
  82. {
  83. for (int i = ; i < L; ++i)
  84. {
  85. for (int j = ; j < KIND; ++j)
  86. {
  87. if (!isExit[next[i][j]])
  88. ++mat[i][next[i][j]];
  89. }
  90. }
  91. }
  92. void matrixMul(LL mat1[MAXN][MAXN], LL mat2[MAXN][MAXN])
  93. {
  94. LL mat3[MAXN][MAXN];
  95. for (int i = ; i < L; ++i)
  96. {
  97. for (int j = ; j < L; ++j)
  98. {
  99. mat3[i][j] = ;
  100. for (int k = ; k < L; ++k)
  101. mat3[i][j] = (mat3[i][j] + mat1[i][k] * mat2[k][j]) % MOD;
  102. }
  103. }
  104. memcpy(mat1, mat3, sizeof(mat3));
  105. }
  106. void matrixQuickMod(LL n)
  107. {
  108. getMatrix();
  109. for (int i = ; i < L; ++i)
  110. {
  111. ret[i][i] = ;
  112. for (int j = ; j < L; ++j)
  113. tmp[i][j] = mat[i][j];
  114. }
  115. while (n)
  116. {
  117. if (n & ) matrixMul(ret, tmp);
  118. matrixMul(tmp, tmp);
  119. n >>= ;
  120. }
  121. }
  122. };
  123. Trie ac;
  124. char str[];
  125. int main()
  126. {
  127. int m;
  128. LL n;
  129. while (scanf("%d %lld", &m, &n) != EOF)
  130. {
  131. ac.init();
  132. for (int i = ; i < m; ++i)
  133. {
  134. scanf("%s", str);
  135. ac.insert(str);
  136. }
  137. ac.build();
  138. ac.matrixQuickMod(n);
  139. int ans = ;
  140. for (int i = ; i < ac.L; ++i)
  141. ans = (ans + ac.ret[][i]) % MOD;
  142. printf("%d\n", ans);
  143. }
  144. return ;
  145. }

POJ 2778 DNA Sequence(AC自动机+矩阵快速幂)的更多相关文章

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

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

  2. POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

    这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...

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

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

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

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

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

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

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

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

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

  8. poj2778DNA Sequence (AC自动机+矩阵快速幂)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud DNA Sequence Time Limit: 1000MS   Memory ...

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

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

  10. poj 2778 DNA Sequence AC自动机

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

随机推荐

  1. 字符编码和python使用encode,decode转换utf-8, gbk, gb2312

    ASCII码 标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符. 在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传 ...

  2. poj1833---字典序算法

    题意:给定一个序列,求它的下k个排列 #include <stdio.h> #include <stdlib.h> int cmp(const void *a,const vo ...

  3. 去英国Savile Row 做件私人定制手工西装_GQ男士网

    去英国Savile Row 做件私人定制手工西装_GQ男士网 去英国Savile Row 做件私人定制手工西装

  4. 利用UIScrollView和UIPageControl实现多页图片欢迎页面

    在.h文件当中实现UIScrollViewDelegate协议,让控制器充当代理: #import <UIKit/UIKit.h> @interface RPRootViewControl ...

  5. Android4.0设置界面改动总结(三)

    Android4.0设置界面改动总结大概介绍了一下设置改tab风格,事实上原理非常easy,理解两个基本的函数就可以: ①.invalidateHeaders(),调用此函数将又一次调用onBuild ...

  6. 全互联结构DVPN综合配置示例

    以下内容摘自正在全面热销的最新网络设备图书“豪华四件套”之一<H3C路由器配置与管理完全手册>(第二版)(其余三本分别是:<Cisco交换机配置与管理完全手册>(第二版).&l ...

  7. SQL数据库插入文本信息

    文本内容

  8. JavaScript之insertBefore()和自定义insertAfter()的用法。

    在JS图片库的第五版开发完后http://www.cnblogs.com/GreenLeaves/p/5691797.html#js_Five_Version我们发现一个问题,就是假设在图片列表之后还 ...

  9. webpack和webpack-dev-server的区别

    第一: webpack只是构建 webpack-dev-server除了构建,还提供web服务   第二:webpack.config.json的路径参数 显然,entry都一样,因为都要知道需要构建 ...

  10. FusionCharts属性大全

    属性的分类就以官方的API文档为准吧: 1.Chart: <1>Functional Attributes(功能属性) <2>Titles and AxisNames(标题和坐 ...