标签:
Description
Input
Output
Sample Input
Sample Output
#include<iostream> #include<queue> #include<string> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int LO=4,NU=1005; inline int f(char u){ if (u==‘A‘) return 0;else if (u==‘C‘) return 1;else if (u==‘G‘) return 2;else if (u==‘T‘) return 3; } struct tree{ int f; bool w; int t[LO]; int v[LO]; }t[NU]; int n,m,p,num; bool us[NU]; char s[10000]; queue <int> q; int dp[1005][NU]; inline bool dfs(int x){ if (x==0) return 0; if (t[x].w) return 1; if (us[x]) return t[x].w; us[x]=1; return t[x].w|=dfs(t[x].f); } inline void in(){ int p=0,l,m=strlen(s); for (register int i=0;i<m;i++){ l=f(s[i]); if (!t[p].t[l]) t[p].t[l]=++num; p=t[p].t[l]; } t[p].w=1; } inline void mafa(){ register int i;int k,p; q.push(0);t[0].f=0; while(!q.empty()){ k=q.front();q.pop(); for (i=0;i<LO;i++) if (t[k].t[i]){ p=t[k].f; while((!t[p].t[i])&&p) p=t[p].f; t[t[k].t[i]].f=(k==p)?0:t[p].t[i]; q.push(t[k].t[i]); } } } const int INF=1e9; int main(){ int tt=0; register int i,j,k,l;int u;int ans; for(;;){ tt++; scanf("%d",&n); if (!n) return 0; num=u=ans=0; for (i=0;i<n;i++) scanf("%s",s),in(); mafa(); for (i=0;i<=num;i++) us[i]=0; for (i=0;i<=num;i++) t[i].w|=dfs(i); for (i=0;i<=num;i++) for (j=0;j<LO;j++){ if (!t[i].t[j]){ u=t[i].f; while(!t[u].t[j]&&u) u=t[u].f; u=t[u].t[j]; }else u=t[i].t[j]; t[i].v[j]=u; } scanf("%s",s); n=strlen(s); for (i=0;i<=n;i++) for (j=0;j<=num;j++) dp[i][j]=INF; dp[0][0]=0; for (i=0;i<n;i++) for (j=0;j<=num;j++) if (dp[i][j]!=INF) for (l=0;l<LO;l++) if (!t[t[j].v[l]].w) if (dp[i+1][t[j].v[l]]>dp[i][j]+(l==f(s[i])?0:1)) dp[i+1][t[j].v[l]]=dp[i][j]+(l==f(s[i])?0:1); ans=INF; for (j=0;j<=num;j++) if (dp[n][j]<ans) ans=dp[n][j]; if (ans==INF) ans=-1; printf("Case %d: %d\n",tt,ans); for (i=0;i<=num;i++) for (j=0;j<LO;j++) t[i].t[j]=t[i].v[j]=0; for (i=0;i<=num;i++) t[i].w=t[i].f=0; } }
标签:
原文地址:http://www.cnblogs.com/Enceladus/p/5312284.html