hdu 2457(ac自动机+dp)
题意:容易理解...
分析:这是一道比较简单的ac自动机+dp的题了,直接上代码。
代码实现:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<queue> using namespace std; struct node{ int next[4]; int fail; int flag; void init() { memset(next,0,sizeof(next)); fail=0; flag=0; } }a[1005]; char keyword[25]; char S[1005]; int tot,len; int dp[1005][1005]; int Min(int a,int b) { return a<b?a:b; } void chushihua() { int i,j; tot=0; a[0].init(); for(i=0;i<1005;i++) for(j=0;j<1005;j++) dp[i][j]=1000000; dp[0][0]=0; } int hash(char x) { if(x=='A') return 0; else if(x=='C') return 1; else if(x=='G') return 2; else return 3; } void insert(char *str) { int index,p=0; for(;*str!='\0';str++) { index=hash(*str); if(a[p].next[index]==0) { a[++tot].init(); a[p].next[index]=tot; } p=a[p].next[index]; } a[p].flag=1; } void build_fail() { queue<int>Q; int p,cur,son,i; Q.push(0); while(!Q.empty()) { p=Q.front(); Q.pop(); for(i=0;i<4;i++) { if(a[p].next[i]!=0) { son=a[p].next[i]; cur=a[p].fail; if(p==0) a[son].fail=0; else { while(cur&&a[cur].next[i]==0) cur=a[cur].fail; a[son].fail=a[cur].next[i]; } if(a[a[son].fail].flag==1) a[son].flag=1; if(a[son].flag==0) Q.push(son); } else a[p].next[i]=a[a[p].fail].next[i]; } } } void solve(int t) { int i,j,k,son,res=1000000; char x; for(i=1;i<=len;i++) { for(j=0;j<=tot;j++) { if(dp[i-1][j]==1000000||a[j].flag==1) continue; for(k=0;k<4;k++) { son=a[j].next[k]; if(a[son].flag==1) continue; if(k==0) x='A'; else if(k==1) x='C'; else if(k==2) x='G'; else x='T'; if(x==S[i-1]) { if(dp[i][son]==1000000) dp[i][son]=dp[i-1][j]; else dp[i][son]=Min(dp[i][son],dp[i-1][j]); } else { if(dp[i][son]==1000000) dp[i][son]=dp[i-1][j]+1; else dp[i][son]=Min(dp[i][son],dp[i-1][j]+1); } } } } for(i=0;i<=tot;i++) if(dp[len][i]<res) res=dp[len][i]; printf("Case %d: ",t); if(res==1000000) printf("%d\n",-1); else printf("%d\n",res); } int main() { int n,t=0; while(scanf("%d",&n)!=EOF&&n) { t++; chushihua(); getchar(); while(n--) { scanf("%s",keyword); insert(keyword); } build_fail(); scanf("%s",S); len=strlen(S); solve(t); } return 0; }
posted on 2013-08-05 12:16 后端bug开发工程师 阅读(391) 评论(0) 编辑 收藏 举报