裸的编辑距离
但是要注意,过程中先判断他们的长度之差s(因为至少要s多步),若小于指定的最大编辑距离,则进去判断,否则会超时
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
using namespace std;
const int M=2000;
int dp[M][M];
int edidis(char *a,char *b,int la,int lb)
{
for(int i=0; i<la; i++)
dp[i][0]=i;
for(int i=0; i<lb; i++)
dp[0][i]=i;
for(int i=1; i<=la; i++)
{
for(int j=1; j<=lb; j++)
{
int cost=0;
if(a[i-1]!=b[j-1])cost=1;
dp[i][j]=min(min(dp[i-1][j-1]+cost,dp[i-1][j]+1),dp[i][j-1]+1);
}
}
return dp[la][lb];
}
int main()
{
int t,n,m,k,g=1;
char ss[15];
char a[2000][15];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%s",a[i]);
printf("Case #%d:\n",g++);
for(int kk=1;kk<=m;kk++)
{
int sum=0;
cin>>ss>>k;
int lb=strlen(ss);
for(int i=1; i<=n; i++)
{
int la=strlen(a[i]);
if(abs(lb-la)<=k)//先判断
{
int dis=edidis(a[i],ss,la,lb);
if(dis<=k)
sum++;
}
}
printf("%d\n",sum);
}
}
return 0;
}