【多次字符串修改】 编辑距离

传送门

题意

给定\(n\)个长度不超过\(10\)的字符串以及\(m\)次询问,每次询问给出一个字符串和一个操作次数上限。
对于每次询问,请你求出给定的\(n\)个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。
每个对字符串进行的单个字符的插入、删除或替换算作一次操作。

数据范围

\(1\leq n,m\leq 1000\)

题解

即有修改总次数限制的最短编辑距离,对于每个串,都与\(n\)个串做一次最短编辑距离,求一下看看最短是多少

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)

const int N=1010;

int n,m;
char s[N][15];
int limit;
int dp[15][15];
bool solve(char s[],char ls[])
{
    int len1=strlen(s+1),len2=strlen(ls+1);

    rep(i,1,len1+1) dp[i][0]=i;
    rep(j,1,len2+1) dp[0][j]=j; 

    rep(i,1,len1+1) rep(j,1,len2+1)
    {
        dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;

        dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(s[i]!=ls[j]));
    }
    if(dp[len1][len2] <= limit) return 1;
    return 0;
}
int main()
{
    cin>>n>>m;
    rep(i,1,n+1) cin>>s[i]+1;
    while(m--)
    {
        char ls[15];
        cin>>ls+1>>limit;
        int ans=0;
        rep(i,1,n+1)
            if(solve(s[i],ls)) ans++;
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2020-10-08 18:24  Hyx'  阅读(89)  评论(0)    收藏  举报