http://poj.org/problem?id=2778

有空再又一次做下,对状态图的理解非常重要

题解:

http://blog.csdn.net/morgan_xww/article/details/7834801

另外做了矩阵幂的模板:

  1. //ac.sz是矩阵的大小
  2. void mulmtr(long long x[MAXNODE][MAXNODE],long long y[MAXNODE][MAXNODE])//y=x*y
  3. {
  4. ll tmp[MAXNODE][MAXNODE];
  5. for(int i=0;i<ac.sz;i++)
  6. {
  7. for(int j=0;j<ac.sz;j++)
  8. {
  9. tmp[i][j]=0;
  10. for(int k=0;k<ac.sz;k++)
  11. tmp[i][j] +=x[i][k]*y[k][j];
  12. tmp[i][j] %=MOD;
  13. }
  14. }
  15. for(int i=0;i<ac.sz;i++)
  16. for(int j=0;j<ac.sz;j++)
  17. y[i][j]=tmp[i][j];
  18. }
  19. void Mtrmi(ll mtr[MAXNODE][MAXNODE],int n)
  20. {
  21. for(int i=0;i<ac.sz;i++)
  22. {
  23. for(int j=0;j<ac.sz;j++)
  24. {
  25. if(i == j)ans[i][j]=1;//E矩阵
  26. else ans[i][j]=0;
  27. }
  28. }
  29. while(n)
  30. {
  31. if(n&1)
  32. {
  33. mulmtr(mtr,ans);
  34. }
  35. mulmtr(mtr,mtr);
  36. n/=2;
  37. }
  38. }

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <map>
  5. #include <queue>
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. #define ll long long
  10.  
  11. const int MAXNODE = 15*15;
  12. const int SSIZE = 2000000000+100;
  13. const int MOD = 100000;
  14. const int SIGMA_SIZE = 4;
  15. const int SIZE = 20;
  16.  
  17. ll mtr[MAXNODE][MAXNODE];
  18. ll ans[MAXNODE][MAXNODE];
  19. int danger[MAXNODE];
  20.  
  21. struct AC
  22. {
  23. int f[MAXNODE];
  24. int val[MAXNODE];
  25. int last[MAXNODE];
  26. int cnt[MAXNODE];
  27. int ch[MAXNODE][SIGMA_SIZE];
  28. int sz;
  29.  
  30. void init()
  31. {
  32. memset(ch[0],0,sizeof(ch[0]));
  33. memset(cnt,0,sizeof(cnt));
  34. f[0]=0;///////////
  35. sz=1;
  36. }
  37.  
  38. inline int idx(char x)
  39. {
  40. if(x == 'A')return 0;
  41. if(x == 'T')return 1;
  42. if(x == 'C')return 2;
  43. if(x == 'G')return 3;
  44. }
  45.  
  46. void insert(char *s, int v)
  47. {
  48. int n=strlen(s),u=0;
  49. for(int i=0;i<n;i++)
  50. {
  51. int id= idx(s[i]);
  52. if(!ch[u][id])
  53. {
  54. memset(ch[sz],0,sizeof(ch[sz]));
  55. val[sz]=0;
  56. ch[u][id]=sz++;
  57. }
  58. u=ch[u][id];
  59. }
  60. val[u]=v;
  61. danger[u]=1;////////
  62. }
  63.  
  64. void getfail()
  65. {
  66. queue<int>q;
  67. f[0]=0;
  68. for(int c=0;c<SIGMA_SIZE;c++)
  69. {
  70. int u=ch[0][c];
  71. if(u)
  72. {
  73. q.push(u);
  74. f[u]=0;
  75. last[u]=0;
  76. }
  77. }
  78. while(!q.empty())
  79. {
  80. int r=q.front();q.pop();
  81. for(int c=0;c<SIGMA_SIZE;c++)
  82. {
  83. int u=ch[r][c];
  84. //if(!u)continue;////////
  85. if(!u)
  86. {
  87. ch[r][c]=ch[f[r]][c];//////
  88. continue;
  89. }
  90. q.push(u);
  91. int v=f[r];
  92. while(v &&!ch[v][c])v=f[v];
  93. f[u]=ch[v][c];
  94. //last[u]=val[f[u]]?f[u]:last[f[u]];
  95. danger[u] |= danger[f[u]];
  96. }
  97. }
  98. }
  99. };
  100. void init()
  101. {
  102. memset(mtr,0,sizeof(mtr));
  103. memset(danger,0,sizeof(danger));
  104. }
  105.  
  106. AC ac;
  107.  
  108. char str[SIZE];
  109.  
  110. void mulmtr(long long x[MAXNODE][MAXNODE],long long y[MAXNODE][MAXNODE])//y=x*y
  111. {
  112. ll tmp[MAXNODE][MAXNODE];
  113. for(int i=0;i<ac.sz;i++)
  114. {
  115. for(int j=0;j<ac.sz;j++)
  116. {
  117. tmp[i][j]=0;
  118. for(int k=0;k<ac.sz;k++)
  119. tmp[i][j] +=x[i][k]*y[k][j];
  120. tmp[i][j] %=MOD;
  121. }
  122. }
  123. for(int i=0;i<ac.sz;i++)
  124. for(int j=0;j<ac.sz;j++)
  125. y[i][j]=tmp[i][j];
  126. }
  127. void Mtrmi(ll mtr[MAXNODE][MAXNODE],int n)
  128. {
  129. for(int i=0;i<ac.sz;i++)
  130. {
  131. for(int j=0;j<ac.sz;j++)
  132. {
  133. if(i == j)ans[i][j]=1;//E矩阵
  134. else ans[i][j]=0;
  135. }
  136. }
  137. while(n)
  138. {
  139. if(n&1)
  140. {
  141. mulmtr(mtr,ans);
  142. }
  143. mulmtr(mtr,mtr);
  144. n/=2;
  145. }
  146. }
  147.  
  148. int main()
  149. {
  150. //freopen("poj2788.txt","r",stdin);
  151. int n,m;
  152. while(~scanf("%d%d",&m,&n))
  153. {
  154. init();
  155. ac.init();
  156. for(int i=1;i<=m;i++)
  157. {
  158. scanf("%s",str);
  159. ac.insert(str,i);
  160. }
  161. ac.getfail();
  162. for(int i=0;i<ac.sz;i++)
  163. if(!danger[i])
  164. for(int j=0;j<4;j++)
  165. if(!danger[ac.ch[i][j]])
  166. {
  167. mtr[i][ac.ch[i][j]]++;
  168. }
  169.  
  170. Mtrmi(mtr,n);
  171. /////////////////////////////////
  172. /* for(int i=0;i<ac.sz;i++)
  173. {
  174. for(int j=0;j<ac.sz;j++)
  175. printf("%lld|%lld ",mtr[i][j],ans[i][j]);
  176. putchar('\n');
  177. }*/
  178. ///////////////////////
  179. for(int i=1;i<ac.sz;i++)
  180. ans[0][0]+=ans[0][i]%MOD;
  181. printf("%I64d\n",ans[0][0]%MOD);
  182. }
  183. return 0;
  184. }

POJ 2778 AC自己主动机+矩阵幂 不错的题的更多相关文章

  1. poj 2778 AC自己主动机 + 矩阵高速幂

    // poj 2778 AC自己主动机 + 矩阵高速幂 // // 题目链接: // // http://poj.org/problem?id=2778 // // 解题思路: // // 建立AC自 ...

  2. Hdu 2243 考研路茫茫——单词情结 (AC自己主动机+矩阵)

    哎哟喂.中文题. . .不说题意了. 首先做过POJ 2778能够知道AC自己主动机是能够求出长度为L的串中不含病毒串的数量的. POJ 2778的大概思路就是先用全部给的病毒串建一个AC自己主动机. ...

  3. hdu 2243 考研绝望——复杂的文字(AC自己主动机+矩阵高速功率)

    pid=2243" target="_blank" style="">题目链接:hdu 2243 考研路茫茫--单词情结 题目大意:略. 解题思 ...

  4. Hdu 3962 Microgene (AC自己主动机+矩阵)

    标题效果: 构造一个字符串,使得有两个和两个以上的目标串.长短L这一系列有多少串都. IDEAS: 只有全款减有1一些字符串,没有目标就是答案. 假定数据是非常小的,够用dp解.dp[i][j][k] ...

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

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

  6. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...

  7. POJ 3691 &amp; HDU 2457 DNA repair (AC自己主动机,DP)

    http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...

  8. poj 1699 Best Sequence(AC自己主动机+如压力DP)

    id=1699" target="_blank" style="">题目链接:poj 1699 Best Sequence 题目大意:给定N个D ...

  9. [POJ 1204]Word Puzzles(Trie树暴搜&amp;AC自己主动机)

    Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...

随机推荐

  1. 黑马day16 jquery&amp;层次选择器

    假设想通过DOM元素之间的层次关系来获取特定元素,比如后代元素,子元素,相邻元素,兄弟元素等,则须要使用层次选择器. 1 .ancestor descendant 使用方法: $("form ...

  2. spring+mybatis利用interceptor(plugin)兑现数据库读写分离

    使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...

  3. Get started - UIkit documentation

    Get started - UIkit documentation Get started Get familiar with the basic setup and structure of UIk ...

  4. 一个必用的javascript框架:underscore.js - wine的思考 - ITeye技术网站

    AngularJS+JqueryMobile+PhoneGap 打造APP « Dogeek AngularJS+JqueryMobile+PhoneGap 打造APP

  5. php连接oracle及简单操作

    使你的php支持oracle,按照以下步骤即可: 1.安装php环境,找一下appserv或者xampp,一键安装,很方便 2.把php的ext目录下的php_oci8.dll拷到system32目录 ...

  6. C++要点

           以下的这些要点是对全部的C++程序猿都适用的.我之所以说它们是最重要的,是由于这些要点中提到的是你通常在C++书中或站点上无法找到的.如:指向成员的指针,这是很多资料中都不愿提到的地方, ...

  7. EasyUI - Messager消息框

    全局设定: JavaScript代码: //设置按钮中的文字,默认是-ok/cancel ,可以任意设置文字,比如现在的-确认/取消 $.messager.defaults = { ok: '确认', ...

  8. QT中的pro文件的编写

    原地址:http://blog.csdn.net/fjb2080/article/details/4833666 我们在编译QT的工程的时候,一般都会让qmake自动生成,但有时我们需要定制我们的工程 ...

  9. 基于visual Studio2013解决C语言竞赛题之1085相邻之和素数

        题目 解决代码及点评 /************************************************************************/ /* ...

  10. android用shape画虚线,怎么也不显示

     一直以为android的shape能画直线.虚线.矩形,圆形等.画直线也就算了.用一个view设一下高度和颜色,就能够出来一条直线了.所以说这个对我来说常常不用,圆形是能够,看看我应用里的消息提 ...