hdu2457DNA repair(ac自动机+dp)
从开始节点往下走,不能走到病毒节点,如果当前状态与原始串不一样就+1,取一个最小值.
- #include <iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<stdlib.h>
- #include<vector>
- #include<cmath>
- #include<queue>
- #include<set>
- #include<string>
- using namespace std;
- #define N 1005
- #define LL long long
- #define INF 0xfffffff
- const double eps = 1e-;
- const double pi = acos(-1.0);
- const double inf = ~0u>>;
- const int child_num = ;
- char vir[];
- char s[N];
- class AC
- {
- private:
- int ch[N][child_num];
- int fail[N];
- int Q[N];
- int val[N];
- int sz;
- int id[];
- char po[];
- int dp[N][N];
- public:
- void init()
- {
- fail[] = ;
- id['A'] = ,id['G'] = ,id['T'] = ,id['C'] = ;
- po[] = 'A',po[] = 'G',po[] = 'T',po[] = 'C';
- }
- void reset()
- {
- memset(ch[],,sizeof(ch[]));
- memset(val,,sizeof(val));
- sz = ;
- }
- void insert(char *a,int key)
- {
- int p = ;
- for(; *a ; a++)
- {
- int d= id[*a];
- if(ch[p][d]==)
- {
- memset(ch[sz],,sizeof(ch[sz]));
- s[sz] = *a;
- ch[p][d] = sz++;
- }
- p = ch[p][d];
- }
- val[p] = (<<key);
- }
- void construct()
- {
- int i,head=,tail = ;
- for(i = ; i < child_num ;i++)
- {
- if(ch[][i])
- {
- fail[ch[][i]] = ;
- Q[tail++] = ch[][i];
- }
- }
- while(head!=tail)
- {
- int u = Q[head++];
- val[u]|=val[fail[u]];
- for(i = ; i < child_num ; i++)
- {
- if(ch[u][i])
- {
- fail[ch[u][i]] = ch[fail[u]][i];
- Q[tail++] = ch[u][i];
- }
- else ch[u][i] = ch[fail[u]][i];
- }
- }
- }
- void work(int n,int kk)
- {
- int i,j,g;
- for(i = ; i <= n ;i++)
- for(j = ;j <= sz ; j++)
- dp[i][j] = INF;
- dp[][] = ;
- for(i = ; i < n ;i++)
- {
- for(j = ;j < sz; j++)
- {
- for(g = ;g < child_num ; g++)
- {
- if(val[ch[j][g]]) continue;
- int o = ;
- if(po[g]!=s[i]) o = ;
- dp[i+][ch[j][g]] = min(dp[i+][ch[j][g]],dp[i][j]+o);
- }
- }
- }
- int ans = INF;
- for(i = ;i < sz ; i++)
- ans = min(ans,dp[n][i]);
- printf("Case %d: ",kk);
- if(ans==INF)
- puts("-1");
- else
- printf("%d\n",ans);
- }
- }ac;
- int main()
- {
- int i,m,kk=;
- ac.init();
- while(scanf("%d",&m)&&m)
- {
- ac.reset();
- for(i = ;i <= m ;i++)
- {
- scanf("%s",vir);
- ac.insert(vir,);
- }
- ac.construct();
- scanf("%s",s);
- int k = strlen(s);
- ac.work(k,++kk);
- }
- return ;
- }
hdu2457DNA repair(ac自动机+dp)的更多相关文章
- hdu_2457_DNA repair(AC自动机+DP)
题目连接:hdu_2457_DNA repair 题意: 给你N个字符串,最后再给你一个要匹配的串,问你最少修改多少次,使得这个串不出现之前给的N的字符串 题解: 刚学AC自动机,切这题还真不知道怎么 ...
- HDU2457 DNA repair —— AC自动机 + DP
题目链接:https://vjudge.net/problem/HDU-2457 DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory ...
- HDU 2457/POJ 3691 DNA repair AC自动机+DP
DNA repair Problem Description Biologists finally invent techniques of repairing DNA that contains ...
- POJ 3691 DNA repair(AC自动机+DP)
题目链接 能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的. 做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的... 状 ...
- [hdu2457]DNA repair(AC自动机+dp)
题意:给出一些不合法的模式DNA串,给出一个原串,问最少需要修改多少个字符,使得原串中不包含非法串. 解题关键:多模式串匹配->AC自动机,求最优值->dp,注意在AC自动机上dp的套路. ...
- POJ3691 DNA repair(AC自动机 DP)
给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][ ...
- HDU 2457 DNA repair (AC自动机+DP)
题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. #include<algorithm ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
随机推荐
- 混合App 框架选型
个人一直想做个App,但是学习 IOS 的过程发现 原生的做界面还是听麻烦的就放弃了.后来就转到混合式App阵营了 混合式App 定义 Hybrid App(混合模式移动应用)是指介于web-app. ...
- 解决python "Non-ASCII character"错误
原文http://jingyan.baidu.com/article/219f4bf7d04887de442d3899.html 1.出现问题的原因:程序中的编码错误,python默认是acii模式, ...
- redis 自启动
第一步: 在/etc/init.d/目录下建立一个名字为 redis 的启动脚本 cd /etc/init.d touch redis 然后在这个脚本中添加如下脚本 <注意修改自己的PIDFI ...
- 用Appium进行android自动化测试
appium是开源的移动端自动化测试框架,可以测试ios,android应用.appium让移动端自动化测试不必限定在某种语言和某个具体的框架:也就是说任何人都可以使用自己最熟悉最顺手的语言以及框架来 ...
- LeetCode Flatten 2D Vector
原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...
- SEO之HTML优化:让你的网站HTML代码更符合SEO规范
摘要HTML优化是网站内部优化的重点,可能对SEO新手来说,容易忽略.符合搜索引擎习惯的HTML代码是极利于SEO的,可以让你的网站获得更好的搜索引擎排名.如何制作一个标准的HTML网页,如何做HTM ...
- django使用gmail
POSTED ON 02 JUL 2007 IN DEVELOPMENT DJANGO PYTHON WEBDid a bit of running around today to get Djang ...
- 数据库的Instance/Crash Recovery
crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...
- svg学习(三)rect
<rect> 标签 <rect> 标签可用来创建矩形,以及矩形的变种. 要理解它的工作原理,请把这些代码拷贝到记事本,然后保存为 "rect1.svg" 文 ...
- SpringMVC学习系列(3) 之 URL请求到Action的映射规则
在系列(2)中我们展示了一个简单的get请求,并返回了一个简单的helloworld页面.本篇我们来学习如何来配置一个action的url映射规则. 在系列(2)中我们在HelloWorldContr ...