链接

从开始节点往下走,不能走到病毒节点,如果当前状态与原始串不一样就+1,取一个最小值.

  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. #include<string>
  11. using namespace std;
  12. #define N 1005
  13. #define LL long long
  14. #define INF 0xfffffff
  15. const double eps = 1e-;
  16. const double pi = acos(-1.0);
  17. const double inf = ~0u>>;
  18. const int child_num = ;
  19. char vir[];
  20. char s[N];
  21. class AC
  22. {
  23. private:
  24. int ch[N][child_num];
  25. int fail[N];
  26. int Q[N];
  27. int val[N];
  28. int sz;
  29. int id[];
  30. char po[];
  31. int dp[N][N];
  32. public:
  33. void init()
  34. {
  35. fail[] = ;
  36. id['A'] = ,id['G'] = ,id['T'] = ,id['C'] = ;
  37. po[] = 'A',po[] = 'G',po[] = 'T',po[] = 'C';
  38. }
  39. void reset()
  40. {
  41. memset(ch[],,sizeof(ch[]));
  42. memset(val,,sizeof(val));
  43. sz = ;
  44. }
  45. void insert(char *a,int key)
  46. {
  47. int p = ;
  48. for(; *a ; a++)
  49. {
  50. int d= id[*a];
  51. if(ch[p][d]==)
  52. {
  53. memset(ch[sz],,sizeof(ch[sz]));
  54. s[sz] = *a;
  55. ch[p][d] = sz++;
  56. }
  57. p = ch[p][d];
  58. }
  59. val[p] = (<<key);
  60. }
  61. void construct()
  62. {
  63. int i,head=,tail = ;
  64. for(i = ; i < child_num ;i++)
  65. {
  66. if(ch[][i])
  67. {
  68. fail[ch[][i]] = ;
  69. Q[tail++] = ch[][i];
  70. }
  71. }
  72. while(head!=tail)
  73. {
  74. int u = Q[head++];
  75. val[u]|=val[fail[u]];
  76. for(i = ; i < child_num ; i++)
  77. {
  78. if(ch[u][i])
  79. {
  80. fail[ch[u][i]] = ch[fail[u]][i];
  81. Q[tail++] = ch[u][i];
  82. }
  83. else ch[u][i] = ch[fail[u]][i];
  84. }
  85. }
  86. }
  87. void work(int n,int kk)
  88. {
  89. int i,j,g;
  90. for(i = ; i <= n ;i++)
  91. for(j = ;j <= sz ; j++)
  92. dp[i][j] = INF;
  93. dp[][] = ;
  94. for(i = ; i < n ;i++)
  95. {
  96. for(j = ;j < sz; j++)
  97. {
  98. for(g = ;g < child_num ; g++)
  99. {
  100. if(val[ch[j][g]]) continue;
  101. int o = ;
  102. if(po[g]!=s[i]) o = ;
  103. dp[i+][ch[j][g]] = min(dp[i+][ch[j][g]],dp[i][j]+o);
  104. }
  105. }
  106. }
  107. int ans = INF;
  108. for(i = ;i < sz ; i++)
  109. ans = min(ans,dp[n][i]);
  110. printf("Case %d: ",kk);
  111. if(ans==INF)
  112. puts("-1");
  113. else
  114. printf("%d\n",ans);
  115. }
  116. }ac;
  117. int main()
  118. {
  119. int i,m,kk=;
  120. ac.init();
  121. while(scanf("%d",&m)&&m)
  122. {
  123. ac.reset();
  124. for(i = ;i <= m ;i++)
  125. {
  126. scanf("%s",vir);
  127. ac.insert(vir,);
  128. }
  129. ac.construct();
  130. scanf("%s",s);
  131. int k = strlen(s);
  132. ac.work(k,++kk);
  133. }
  134. return ;
  135. }

hdu2457DNA repair(ac自动机+dp)的更多相关文章

  1. hdu_2457_DNA repair(AC自动机+DP)

    题目连接:hdu_2457_DNA repair 题意: 给你N个字符串,最后再给你一个要匹配的串,问你最少修改多少次,使得这个串不出现之前给的N的字符串 题解: 刚学AC自动机,切这题还真不知道怎么 ...

  2. HDU2457 DNA repair —— AC自动机 + DP

    题目链接:https://vjudge.net/problem/HDU-2457 DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory ...

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

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

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

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

  5. [hdu2457]DNA repair(AC自动机+dp)

    题意:给出一些不合法的模式DNA串,给出一个原串,问最少需要修改多少个字符,使得原串中不包含非法串. 解题关键:多模式串匹配->AC自动机,求最优值->dp,注意在AC自动机上dp的套路. ...

  6. POJ3691 DNA repair(AC自动机 DP)

    给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][ ...

  7. HDU 2457 DNA repair (AC自动机+DP)

    题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. #include<algorithm ...

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

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

  9. HDU 2457 DNA repair(AC自动机+DP)题解

    题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...

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

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

随机推荐

  1. 混合App 框架选型

    个人一直想做个App,但是学习 IOS 的过程发现 原生的做界面还是听麻烦的就放弃了.后来就转到混合式App阵营了 混合式App 定义 Hybrid App(混合模式移动应用)是指介于web-app. ...

  2. 解决python "Non-ASCII character"错误

    原文http://jingyan.baidu.com/article/219f4bf7d04887de442d3899.html 1.出现问题的原因:程序中的编码错误,python默认是acii模式, ...

  3. redis 自启动

    第一步: 在/etc/init.d/目录下建立一个名字为 redis 的启动脚本 cd /etc/init.d touch redis 然后在这个脚本中添加如下脚本  <注意修改自己的PIDFI ...

  4. 用Appium进行android自动化测试

    appium是开源的移动端自动化测试框架,可以测试ios,android应用.appium让移动端自动化测试不必限定在某种语言和某个具体的框架:也就是说任何人都可以使用自己最熟悉最顺手的语言以及框架来 ...

  5. LeetCode Flatten 2D Vector

    原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...

  6. SEO之HTML优化:让你的网站HTML代码更符合SEO规范

    摘要HTML优化是网站内部优化的重点,可能对SEO新手来说,容易忽略.符合搜索引擎习惯的HTML代码是极利于SEO的,可以让你的网站获得更好的搜索引擎排名.如何制作一个标准的HTML网页,如何做HTM ...

  7. django使用gmail

    POSTED ON 02 JUL 2007 IN DEVELOPMENT DJANGO PYTHON WEBDid a bit of running around today to get Djang ...

  8. 数据库的Instance/Crash Recovery

    crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...

  9. svg学习(三)rect

    <rect> 标签 <rect> 标签可用来创建矩形,以及矩形的变种. 要理解它的工作原理,请把这些代码拷贝到记事本,然后保存为 "rect1.svg" 文 ...

  10. SpringMVC学习系列(3) 之 URL请求到Action的映射规则

    在系列(2)中我们展示了一个简单的get请求,并返回了一个简单的helloworld页面.本篇我们来学习如何来配置一个action的url映射规则. 在系列(2)中我们在HelloWorldContr ...