标签:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int maxn=200100; const int INF=(1<<29); char s[maxn]; char t[30][30]; int n; int dp[30][maxn]; int DP(char *t,char *s,int m,int n) { int res=INF; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++) dp[i][j]=0; } for(int i=1;i<=m;i++){ dp[i][0]=i; for(int j=1;j<=n;j++){ dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+(t[i-1]!=s[j-1])); if(i==m) res=min(res,dp[i][j]); } } return res; } int main() { freopen("in.txt","r",stdin); while(scanf("%s",s)!=EOF){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s",t[i]); int len=strlen(s); int up=min(20,len); for(int i=0;i<up;i++) s[i+len]=s[i]; s[up+len]=‘\0‘; int ans=INF,p=1; for(int i=1;i<=n;i++){ int m=strlen(t[i]); int tmp=INF; if(m<=len){ tmp=min(tmp,DP(t[i],s,m,len+up)); } else{ char now[30]; for(int j=0;j+len<len+up;j++){ strncpy(now,s+j,len); tmp=min(tmp,DP(t[i],now,m,len)); } } if(tmp<ans) ans=tmp,p=i; else if(tmp==ans&&strcmp(t[i],t[p])<0) p=i; } printf("%s %d\n",t[p],ans); } return 0; }
hdu4271 Find Black Hand 2012长春网络赛E题 最短编辑距离
标签:
原文地址:http://www.cnblogs.com/--560/p/4781792.html