HDU 4323 Magic Number(编辑距离DP)

时间:2023-03-08 21:08:21

http://acm.hdu.edu.cn/showproblem.php?pid=4323

题意:

给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个串可以转化为询问中给的串。

思路:

明显的编辑距离DP,直接暴力过了,网上有用bk树的,可惜我不会。

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int n, m;
char s[][];
char tmp[];
int dp[][]; int main()
{
//freopen("in.txt","r",stdin);
int T;
int kase = ;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%s",s[i]);
printf("Case #%d:\n",++kase);
while(m--)
{
int ans = ;
int x; scanf("%s%d",tmp,&x);
for(int t=;t<=n;t++)
{
int n1 = strlen(s[t]);
int n2 = strlen(tmp);
for(int i=;i<=n1;i++) dp[i][] = i;
for(int i=;i<=n2;i++) dp[][i] = i;
for(int i=;i<=n1;i++)
for(int j=;j<=n2;j++)
{
dp[i][j] = min(dp[i-][j],dp[i][j-])+;
dp[i][j] = min(dp[i][j],dp[i-][j-]+(s[t][i-]!=tmp[j-]));
}
if(dp[n1][n2]<=x) ans++;
}
printf("%d\n",ans);
}
}
return ;
}