先用AC自动机构建一个不含有任何病毒串的 DFA , dp[i][j] 表示到目标串的第 i 个字符,DFA 状态为 j 时的最小修改数量。则 dp[i][ son[j] ]= min{ dp[i][ son[j] ], dp[i-1][j]+ (tran[j][ son[j] ]!= str[i] ) } tran[j][ son[j] ]表示从 j 到 son[j] 经过的字母边。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define inf 0x7fffffff
int const N= 2000;
struct Node{
int next[4];
int fail, flag;
void init(){
for( int i= 0; i< 4; ++i ) next[i]= 0;
fail= -1; flag= 0;
}
}tb[N];
char str[N];
int dp[N][N], n, cnt;
int inline toInt( char ch ){
if( ch== 'A' ) return 0;
if( ch== 'T' ) return 1;
if( ch== 'G' ) return 2;
if( ch== 'C' ) return 3;
}
void insert( char*s ){
int rt= 0;
while( *s ){
int t= toInt( *s );
if( tb[rt].next[t]== 0 ){
tb[++cnt].init();
tb[rt].next[t]= cnt;
}
rt= tb[rt].next[t]; s++;
}
tb[rt].flag= 1;
}
int que[N], head, tail;
void bfs(){
int p, q, now;
head= 0, tail= 0, que[0]= 0;
while( head<= tail ){
now= que[head++];
for( int t= 0; t< 4; ++t )
if( tb[now].next[t] ){
p= tb[now].next[t]; q= tb[now].fail;
while( q!= -1 && !tb[q].next[t] ) q= tb[q].fail;
if( q== -1 ) tb[p].fail= 0;
else{
tb[p].fail= tb[q].next[t];
tb[p].flag|= tb[ tb[p].fail ].flag;
}
que[++tail]= p;
}
else{
q= tb[now].fail;
while( q!= -1 && !tb[q].next[t] ) q= tb[q].fail;
if( q== -1 ) tb[now].next[t]= 0;
else tb[now].next[t]= tb[q].next[t];
}
}
}
int main(){
int test= 1;
while( scanf("%d",&n)!= EOF ){
if( n== 0 ) return 0;
cnt= 0; tb[0].init();
for( int i= 0; i< n; ++i ){
scanf("%s", str );
insert( str );
}
bfs();
scanf("%s",str);
int len= strlen(str);
for( int i= 0; i<= len; ++i )
for( int j= 0; j<= cnt; ++j ) dp[i][j]= inf;
dp[0][0]= 0;
for( int i= 1; i<= len; ++i ){
for( int j= 0; j<= cnt; ++j )
if( dp[i-1][j]!= inf && !tb[j].flag ){
for( int t= 0; t< 4; ++t )
if( !tb[ tb[j].next[t] ].flag ){
int k= tb[j].next[t];
dp[i][k]= min( dp[i][k], dp[i-1][j]+ ( t!= toInt( str[i-1] ) ) );
}
}
}
int ans= inf;
for( int i= 0; i<= cnt; ++i ) ans= min( ans, dp[len][i] );
printf("Case %d: ", test++ );
if( ans== inf ) printf("-1\n");
else printf("%d\n", ans );
}
return 0;
}
分享到:
相关推荐
北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者和学生提供在线编程训练的平台。这个资源集合了北大POJ初级阶段的所有题目,包含已通过(Accepted, AC)的...
ACM PKU_poj 1197 仓库问题源代码,愿与大家共享。若谁更好的代码,多谢提供。
标题“PKU 、POJ ACM/ICPC300多题的代码”指的是北京大学(PKU)和编程在线评测平台POJ上收集的300多道ACM/ICPC(国际大学生程序设计竞赛)比赛题目解题代码。这个压缩包包含了解决这些竞赛问题的算法和程序实现,是...
PKU Online Judge上面很全面的动态规划试题总结。动态规划是ACM考点中最重要的一大类算法之一,对于工作人员来说,动态规划也是实际开发中...这是POJ上面很多DP题目的总结与深刻分析。利于算法学习,学长给的,在此分享
标题“PKU_poj 1001~1009”揭示了这是一组与北京大学(Peking University)编程竞赛平台POJ相关的解决方案。在这个压缩包中,包含了从问题1001到1009的C++源代码,表明这些代码已经过验证并成功解决了对应的算法问题。...
【标题】"POJ 300多题AC代码"涉及的是编程竞赛中的问题解决和算法实践,主要针对ACM(国际大学生程序设计竞赛)的比赛训练。POJ(Problemset Online Judge)是一个在线的编程练习平台,提供了丰富的编程题目供参赛者...
根据给定的文件信息,我们可以总结出以下关于POJ(PKU)问题2494“Acid Text”以及其Java代码实现的关键知识点: ### 1. POJ(PKU)2494:Acid Text POJ(Peking University Online Judge)是北京大学的一个在线...
标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...
1011,1012,1013,1014,1015,1017,1026,1028,1032,1035,1041,1046,1129 1149 1154 1165 1182 1185 1190 1191 1201 1251 1273 1275 1276 1286 1322 1338 1363 1364 1401 1456 1459 1564 1579 1637 1657 1658 ...
标题中的“pku1088.rar_pku 10_pku 1088_poj 1088”指的是北京大学(Peking University, PKU)编程竞赛中的第1088题,也称为POJ(Peking University Online Judge)的1088题。这个题目在编程竞赛社区中通常有一个特定的...
标题中的"POJ.rar_pku ac_pku.1050"暗示了这是一个与北京大学(Peking University, 简称PKU)编程竞赛相关的压缩文件,其中包含了作者通过验证(Passed All Cases, 简称AC)的代码,具体是针对PKU题目编号1050的问题。...
标题中的“POJ”指的是“Programming Online Judge”,它是中国北京大学(北大)开发的一个在线编程竞赛平台,用于训练和测试程序员的算法和编程能力。在这个平台上,用户可以提交代码解决各种算法问题,如果代码能...
标题中的“pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11”似乎是指北京大学(Peking University, PKU)编程竞赛中的一道题目,编号为1151,与“Atlantis”这个主题相关。这道题目在多个平台上也被提及...
C http://www.icourse163.org/learn/PKU-1001553023 CC++CC++ http://cxsjsxmooc.openjudge.cn/2017t1summerall/
标题中的"poj3252.rar_pku 3252_poj32"表明这是一个与编程竞赛相关的资源,具体来说是北京大学(PKU)ACM竞赛中的问题3252。"poj"通常指的是"Programming Online Judge",这是一个在线编程比赛平台,而"Pku"则代表...
【标题】"poj 130题 acm pku" 涉及的是ACM(国际大学生程序设计竞赛)中的PKU(北京大学)在线判题系统POJ(Problem Online Judge)的相关题目。ACM/ICPC(International Collegiate Programming Contest)是全球...
没钱了,拿点东西出来换点钱...这题的想法是老师在讲最优二元树时偶然想到的...感觉还行
POJ(PKU Online Judge)作为北京大学维护的一个在线评测系统,是许多ACMer练习和提交代码的重要平台。在这个平台上,AC的解题报告是衡量一个程序员算法理解和实现能力的关键指标。 一、ACM竞赛编程基础 ACM竞赛...
根据提供的文件信息,我们可以分析出该段代码是用于解决POJ平台上的2314题的一种解决方案,主要涉及到了变量管理、表达式处理等方面。下面将详细解释代码中的关键概念和实现逻辑。 ### 关键概念解析 #### Variable...