2 AAA AAG AAAG 2 A TG TGAATG 4 A G C T AGT 0
Case 1: 1 Case 2: 4 Case 3: -1 求不含病毒串所需要的最少修改。简单dp 代码:/* *********************************************** Author :xianxingwuguan Created Time :2014-2-3 14:41:38 File Name :1.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; int dp[1010][1010]; struct Trie{ int next[1010][4],end[1010],fail[1010]; int root,L; int newnode(){ for(int i=0;i<4;i++) next[L][i]=-1; end[L++]=0; return L-1; } void init(){ L=0; root=newnode(); } int id(char ch){ if(ch==‘A‘)return 0; if(ch==‘T‘)return 1; if(ch==‘C‘)return 2; return 3; } void insert(char *str){ int len=strlen(str); int now=root; for(int i=0;i<len;i++){ int p=id(str[i]); if(next[now][p]==-1) next[now][p]=newnode(); now=next[now][p]; } end[now]=1; } void build(){ queue<int> q; fail[root]=root; for(int i=0;i<4;i++) if(next[root][i]==-1) next[root][i]=root; else { fail[next[root][i]]=root; q.push(next[root][i]); } while(!q.empty()){ int now=q.front(); q.pop(); end[now]|=end[fail[now]]; for(int i=0;i<4;i++) if(next[now][i]==-1) next[now][i]=next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; q.push(next[now][i]); } } } int solve(char *str){ int n=strlen(str); for(int i=0;i<=n;i++) for(int j=0;j<L;j++) dp[i][j]=INF; dp[0][root]=0; for(int i=0;i<n;i++) for(int j=0;j<L;j++) if(dp[i][j]<INF){ for(int k=0;k<4;k++){ int p=next[j][k]; if(end[p])continue; int tt=dp[i][j]+(id(str[i])!=k); dp[i+1][p]=min(dp[i+1][p],tt); } } int ans=INF; for(int i=0;i<L;i++) ans=min(ans,dp[n][i]); if(ans==INF)ans=-1; return ans; } }ac; char str[1010]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int i,j,k,m,n,T=0; while(~scanf("%d",&n)&&n){ ac.init(); while(n--){ scanf("%s",str); ac.insert(str); } ac.build(); //cout<<"hahhah:"<<ac.L<<endl; scanf("%s",str); printf("Case %d: %d\n",++T,ac.solve(str)); } return 0; }
原文:http://blog.csdn.net/xianxingwuguan1/article/details/18909939