//dp[i][j]表示a串匹配到i,b匹配到j的最小编辑距离
#include<stdio.h>
#include<string.h>
const int INF=100000;
const int maxn=100055;
char s[maxn],t[maxn];
char ans[maxn];
int max;
int dp[maxn][15];
int Min(int a,int b){
return a<b?a:b;
}
int Gao(char s[],char t[],int l1,int l2){
int i,j,k;
for(i=0;i<=l1;i++)
dp[i][0]=0;
for(i=0;i<=l2;i++)
dp[0][i]=i;
for(i=1;i<=l1;i++)
for(j=1;j<=l2;j++){
dp[i][j]=dp[i-1][j]+1;
dp[i][j]=Min(dp[i][j],dp[i][j-1]+1);
dp[i][j]=Min(dp[i][j],dp[i-1][j-1]+(s[i-1]!=t[j-1]));
}
int ret=INF;
for(i=1;i<=l1;i++){
ret=Min(ret,dp[i][l2]);
}
return ret;
}
int main(){
int ret;
int i,j,k,n;
int l1,l2,len;
while(scanf("%s",s)!=EOF){
l1=strlen(s);
for(i=0;i<9 && i<l1 && s[i]!='\0';i++)
s[l1+i]=s[i];
len=i;
scanf("%d",&n);
max=-1;
for(i=0;i<n;i++){
scanf("%s",t);
l2=strlen(t);
ret=INF;
if(l1<l2){
for(j=0;j<len;j++){
ret=Min(ret,Gao(s+j,t,l1,l2));
}
}else{
ret=Gao(s,t,l1+len,l2);
}
if(max==-1 || max>ret || max==ret && strcmp(ans,t)>0){
max=ret;
strcpy(ans,t);
}
}
printf("%s %d\n",ans,max);
}
return 0;
}
/*
abcd
1
abcdabcd
*/
Find Black Hand HDU
最新推荐文章于 2018-04-18 15:07:06 发布