AC自动机+dp。问改变多少个字符能让目标串不含病毒串。即走过多少步不经过病毒串终点。又是同样的问题。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define REP(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
const int nmax=1005;
const int inf=0x7f7f7f7f;
int ch[nmax][4],fail[nmax],pt=0,dp[nmax][nmax];
bool F[nmax];
char s[nmax];
int id(char c){
if(c=='A') return 0;
if(c=='C') return 1;
if(c=='G') return 2;
else return 3;
}
void insert(){
int t=0,len=strlen(s);
REP(i,0,len-1) {
if(!ch[t][id(s[i])]) ch[t][id(s[i])]=++pt;
t=ch[t][id(s[i])];
}
F[t]=true;
}
queue<int>q;
void getfail(){
q.push(0);fail[0]=0;
while(!q.empty()){
int x=q.front();q.pop();
REP(i,0,3){
if(ch[x][i]) q.push(ch[x][i]),fail[ch[x][i]]=x==0?0:ch[fail[x]][i];
else ch[x][i]=x==0?0:ch[fail[x]][i];
}
F[x]|=F[fail[x]];
}
}
void work(int x){
clr(dp,0x7f);dp[0][0]=0;
scanf("%s",s);int len=strlen(s);
REP(i,0,len-1) REP(j,0,pt) if(dp[i][j]!=inf){
REP(k,0,3){
int tmp=ch[j][k];if(F[tmp]) continue;
int temp=(k==id(s[i]))?dp[i][j]:dp[i][j]+1;
dp[i+1][tmp]=min(dp[i+1][tmp],temp);
}
}
int ans=inf;
REP(i,0,pt) ans=min(ans,dp[len][i]);
if(ans==inf) printf("Case %d: -1\n",x);
else printf("Case %d: %d\n",x,ans);
}
int main(){
int n,cur=0;
while(scanf("%d",&n)!=EOF&&n){
clr(fail,0);clr(ch,0);clr(F,false);pt=0;
REP(i,1,n) scanf("%s",s),insert();
getfail();work(++cur);
}
return 0;
}

  


DNA repair

Time
Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 2204 Accepted Submission(s):
1168

Problem Description
Biologists finally invent techniques of repairing DNA
that contains segments causing kinds of inherited diseases. For the sake of
simplicity, a DNA is represented as a string containing characters 'A', 'G' ,
'C' and 'T'. The repairing techniques are simply to change some characters to
eliminate all segments causing diseases. For example, we can repair a DNA
"AAGCAG" to "AGGCAC" to eliminate the initial causing disease segments "AAG",
"AGC" and "CAG" by changing two characters. Note that the repaired DNA can still
contain only characters 'A', 'G', 'C' and 'T'.

You are to help the
biologists to repair a DNA by changing least number of characters.

 
Input
The input consists of multiple test cases. Each test
case starts with a line containing one integers N (1 ≤ N ≤ 50), which is the
number of DNA segments causing inherited diseases.
The following N lines
gives N non-empty strings of length not greater than 20 containing only
characters in "AGCT", which are the DNA segments causing inherited
disease.
The last line of the test case is a non-empty string of length not
greater than 1000 containing only characters in "AGCT", which is the DNA to be
repaired.

The last test case is followed by a line containing one
zeros.

 
Output
For each test case, print a line containing the test
case number( beginning with 1) followed by the
number of characters which
need to be changed. If it's impossible to repair the given DNA, print -1.
 
Sample Input
2
AAA
AAG
AAAG
2
A
TG
TGAATG
4
A
G
C
T
AGT
0
 
Sample Output
Case 1: 1
Case 2: 4
Case 3: -1
 
Source
 
Recommend
teddy | We have carefully selected several similar
problems for you: 2458 2459 2456 2461 2462

hdu2457:DNA repair的更多相关文章

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

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

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

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

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

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

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

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

  5. 【POJ3691】 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description B ...

  6. 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: ...

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

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4815   Accepted: 2237 Descri ...

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

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

  9. poj 3691 DNA repair(AC自己主动机+dp)

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5877   Accepted: 2760 Descri ...

随机推荐

  1. foxmail创建163公司企业邮箱的时候会出现ERR Unable to log on

    foxmail创建163公司企业邮箱的时候会出现ERR Unable to log on 解决办法:把pop.qiye.163.com更改为pop.ym.163.com,瞬间创建成功....也许是网易 ...

  2. oracle 判断是否数字 正则表达式法

     SELECT '-100'    FROM dual   WHERE REGEXP_LIKE('-100','(^[+-]?\d{0,}\.?\d{0,}$)'); REGEXP_LIKE 用法: ...

  3. SUID ,SGID ,Sticky

    SUID passwd:s SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s FILE chmod u-s FILE 如果FILE本身原来就有执行权限, ...

  4. GhostDoc:生成.NET API文档的工具 (帮忙文档)

    在 Sandcastle:生成.NET API文档的工具 (帮忙文档) 后提供另一个生成API文档的工具.   1) 准备工作 安装GhostDoc Proc. 收费的哦.... 这个工具的优势是不像 ...

  5. RedHat Linux下注册Apache为系统服务并设为开机启动

    1.系统环境: 操作系统:Red Hat Enterprise Linux Server release 5.4 Apache版本:httpd-2.2.19 2.注册服务 #将apachectl复制到 ...

  6. 1. what is Lua?

    glue language Lua is a proven, robust language, small.

  7. HDU4670 Cube number on a tree 树分治

    人生的第一道树分治,要是早点学我南京赛就不用那么挫了,树分治的思路其实很简单,就是对子树找到一个重心(Centroid),实现重心分解,然后递归的解决分开后的树的子问题,关键是合并,当要合并跨过重心的 ...

  8. hdu 1270 小希的数表

    思路:一定有sum[1]=num[1]+num[2],sum[2]=num[1]+num[3]; 但是sum[3]不知道是由num[1]+num[4]还是num[2]+num[3],这就需要枚举一下了 ...

  9. intellij idea 12、13 win8 下 中文输入覆盖的问题(搜狗输入法或者其他输入法)

    最近升级到idea12,发现中文输入存在问题,输入中文的时候会出现空格,并且覆盖后面的字符,这个问题让我很郁闷. 假设idea的安装位置为:D:\Program Files\JetBrains\Int ...

  10. RMQ和LCA

    RMQ(Range Minimum/Maximum Query),即区间最值查询 查询很多的时候求[l,r]的最大值可以弄一个数组f[i,j]表示i~j的最大值 //这个是线段树 rmq是f[i,j] ...