链接

第一次做这种题目,参考了下题解,相当于把树扯直了做DP,估计这一类题都是这个套路吧。

状态方程dp[i][next] = dp[i][next]+dp[i][j] ;dp[i][j]表示长度为i的第J个结点的时候满足题意的num,next为当前j点所能走到的下一个合法的结点。

需要用高精度,看到一些规范的高精度写法,觉得不错,有空整理下来。

不知道是不是我理解错了,按理说字符串病毒长度不应超过10.。但开到55依旧RE,开550AC。。。

  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stdlib.h>
  6. #include<vector>
  7. #include<cmath>
  8. #include<queue>
  9. #include<set>
  10. using namespace std;
  11. #define N 110
  12. #define LL long long
  13. #define INF 0xfffffff
  14. const double eps = 1e-;
  15. const double pi = acos(-1.0);
  16. const double inf = ~0u>>;
  17. const int child_num = ;
  18. const int BASE = ;
  19. const int DIG = ;
  20. char s[N*],vir[];
  21. int id[];
  22. struct bignum
  23. {
  24. int a[],len;
  25. bignum()
  26. {
  27. memset(a,,sizeof(a));
  28. len = ;
  29. }
  30. bignum(int v)
  31. {
  32. memset(a,,sizeof(a));
  33. len = ;
  34. do
  35. {
  36. a[len++] = v%BASE;
  37. v/=BASE;
  38. }while(v);
  39. }
  40. /*bignum(const char s[])
  41. {
  42. memset(a,0,sizeof(a));
  43. int k = strlen(s);
  44. len = k/DIG;
  45. if(k%DIG) len++;
  46. int cnt = 0;
  47. for(int i = k-1; i >= 0 ; i-=DIG)
  48. {
  49. int t = 0;
  50. int kk = i-DIG+1;
  51. if(kk<0) kk =0;
  52. for(int j = kk ; j <= i ; j++)
  53. t = t*10+s[j]-'0';
  54. a[cnt++] = t;
  55. }
  56. }*/
  57. bignum operator + (const bignum &b)const
  58. {
  59. bignum res;
  60. res.len = max(len,b.len);
  61. int i;
  62. for(i = ; i < res.len ;i ++)
  63. res.a[i] = ;
  64. for(i = ; i < res.len ; i++)
  65. {
  66. res.a[i] += ((i<len)?a[i]:)+((i<b.len)?b.a[i]:);
  67. res.a[i+] += res.a[i]/BASE;
  68. res.a[i] = res.a[i]%BASE;
  69. }
  70. if(res.a[res.len]>) res.len++;
  71. return res;
  72. }
  73. void output()
  74. {
  75. printf("%d",a[len-]);
  76. for(int i = len- ; i >= ; i--)
  77. printf("%04d",a[i]);
  78. printf("\n");
  79. }
  80. }dp[][];
  81. class AC
  82. {
  83. private:
  84. int ch[N][child_num];
  85. int Q[N];
  86. int val[N];
  87. int fail[N];
  88. //int id[N];
  89. int sz;
  90. public :
  91. void init()
  92. {
  93. fail[] = ;
  94. //for(int i = 0 ;i < child_num-32 ; i++)
  95. //id[i+32] = i;
  96. }
  97. void reset()
  98. {
  99. memset(val,,sizeof(val));
  100. memset(fail,,sizeof(fail));
  101. memset(ch[],,sizeof(ch[]));
  102. sz = ;
  103. }
  104. void insert(char *a,int key)
  105. {
  106. int k = strlen(a),p = ;
  107. for(int i = ; i < k ;i++)
  108. {
  109. int d = id[a[i]];
  110. if(ch[p][d]==)
  111. {
  112. memset(ch[sz],,sizeof(ch[sz]));
  113. ch[p][d] = sz++;
  114. }
  115. p = ch[p][d];
  116. }
  117. val[p] = key;
  118. }
  119. void construct(int n)
  120. {
  121. int i,head=,tail = ;
  122. for(i = ; i < n ; i++)
  123. {
  124. if(ch[][i])
  125. {
  126. Q[tail++] = ch[][i];
  127. fail[ch[][i]] = ;
  128. }
  129. }
  130. while(head!=tail)
  131. {
  132. int u = Q[head++];
  133. val[u]|=val[fail[u]];
  134. for(i = ; i < n ; i++)
  135. {
  136. if(ch[u][i])
  137. {
  138. Q[tail++] = ch[u][i];
  139. fail[ch[u][i]] = ch[fail[u]][i];
  140. }
  141. else ch[u][i] = ch[fail[u]][i];
  142. }
  143. }
  144. }
  145. void work(int m,int n)
  146. {
  147. int i,j,g;
  148. for(i = ; i <= m ;i++)
  149. for(j = ;j <= sz; j++)
  150. dp[i][j] = bignum();
  151. dp[][] = bignum();
  152. for(i = ; i < m ;i++)
  153. {
  154. for(j = ; j < sz ;j++)
  155. for(g = ; g < n ; g++)
  156. if(!val[ch[j][g]])
  157. {
  158. dp[i+][ch[j][g]]=dp[i+][ch[j][g]]+dp[i][j];
  159. }
  160. }
  161. bignum ans = bignum();
  162. for(j = ;j < sz ; j++)
  163. ans=ans+dp[m][j];
  164. ans.output();
  165. }
  166. }ac;
  167. int main()
  168. {
  169. int n,m,i,p;
  170. ac.init();
  171. while(cin>>n>>m>>p)
  172. {
  173. cin>>s;
  174. for(i = ; i < n; i++)
  175. id[s[i]] = i;
  176. ac.reset();
  177. for(i = ;i <= p; i++)
  178. {
  179. scanf("%s",vir);
  180. ac.insert(vir,);
  181. }
  182. ac.construct(n);
  183. ac.work(m,n);
  184. }
  185. return ;
  186. }

poj1625Censored!(AC自动机+dp)的更多相关文章

  1. POJ1625 Censored!(AC自动机+DP)

    题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...

  2. HDU2296 Ring(AC自动机+DP)

    题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...

  3. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

  4. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...

  5. hdu 2457(ac自动机+dp)

    题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...

  6. HDU 2425 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. HDU2296——Ring(AC自动机+DP)

    题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...

  8. tyvj P1519 博彩游戏(AC自动机+DP滚动数组)

    P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...

  9. bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...

随机推荐

  1. PHP检测移动设备类mobile detection使用实例

    目前,一个网站有多个版本是很正常的,如PC版,3G版,移动版等等.根据不同的浏览设备我们需要定向到不同的版本中.不仅如此,我们有时候还需要根据不同的客户端加载不同的CSS,因此我们需要能够检测浏览设备 ...

  2. 接口测试从未如此简单 - Postman (Chrome插件)

    接口测试从未如此简单 - Postman (Chrome插件) 一个非常有力的Http Client工具用来测试Web服务的, 我这里来介绍如何用它测试restful web service 注:转载 ...

  3. Android中<meta-data>的使用

    [转]  原文 在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application> .& ...

  4. [troubleshoot][daily][archlinux][pacman] pacman 与 pip 包文件冲突

    今天滚系统,再次遭遇包冲突: (/) checking % error: failed to commit transaction (conflicting files) python2-reques ...

  5. JavaScript 字符 &quot;转换

    后台把一个Json类型的数据当成字符串返回到前台,但是到前台变成了下面的这个样子 "[{"name":"IE","y":72},{ ...

  6. css3超过指定宽度文字,显示省略号

    text-overflow:ellipsis; overflow:hidden; white-space:nowrap; width:200px;

  7. C#异步:实现一个最简单的异步

    异步就是方法异步执行, 这个好理解. 异步有啥用? 以前只是听说过, 也不想计较. 不过还是碰到了需要这个东西的时候. 比如: 定时执行, 如果不用异步方法,也不用定时器,只用Thread.Sleep ...

  8. pepperflash

    sudo apt-get install pepperflashplugin-nonfree sudo update-pepperflashplugin-nonfree --install

  9. Spring 计划

    3.0----------------------------------------------------- SCRUM 流程的步骤2: Spring 计划 1. 确保product backlo ...

  10. PHP---------PHP函数里面的static静态变量

    工作一年了,一年里很少用到static这个关键词,不管是类里面还是方法里面基本都没怎么用过.平时看到类里面有这个都没什么好奇的,今天在函数里面看到了这个,就去百度了一下. <?phpfuncti ...