链接:点击打开链接
题意:给出n个串和m次询问,每次询问给出一个串和能够改变的最大值,问n个串中几个可以变成询问的串
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[15][15];
char s[15],a[1505][15];
int main(){
int t,i,j,k,n,m,ans,cas,num,len1,len2,tmp;
scanf("%d",&t);
for(cas=1;cas<=t;cas++){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",a[i]+1);
printf("Case #%d:\n",cas);
while(m--){ //这题数据弱,理论上O(1500*1000*130)的复杂度
ans=0; //数据弱所以可以直接暴力跑编辑距离,长度差大于
scanf("%s%d",s+1,&num); //num时不用跑,正解应该是网上题解的bk树...
for(i=1;i<=n;i++){
len1=strlen(a[i]+1);
len2=strlen(s+1);
if(abs(len1-len2)>num)
continue;
for(j=0;j<=len2;j++)
dp[0][j]=j;
for(j=0;j<=len1;j++)
dp[j][0]=j;
for(j=1;j<=len1;j++){
for(k=1;k<=len2;k++){
dp[j][k]=min(dp[j-1][k],dp[j][k-1])+1;
if(a[i][j]==s[k])
tmp=0;
else
tmp=1;
dp[j][k]=min(dp[j][k],dp[j-1][k-1]+tmp);
}
}
if(dp[len1][len2]<=num)
ans++;
}
printf("%d\n",ans);
}
}
return 0;
}