HDU 4271 Find Black Hand 求字串编辑距离dp

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

题意:给定串长<=100000的母串和n(n<=10)且长度<=10的小串,问哪一个小串在母串中通过增加删除修改一个字母的操作数(即编辑距离)最小变成
         母串中的substring,求最小的编辑距离,和对应字典序最小的字串。

题解:比赛的时候看了一眼,substring看着有点晃,就搞别的了,还是自己太弱最后没有时间仔细想想这个题目。

         对于两个串的编辑距离可以用O(n*m)的复杂度来搞,对于字串只需要做一点修改即可,具体见代码注释。
         对于长度为len的串,要想成为母串的substring最大的编辑距离不超过len。

         对于题目描述的问题,因为环的存在考虑把原串的前10位直接复制到原串后面,但是需要注意的是如果母串abcd,子串abcda,最少需要操作次数是1,
         但是将abcd复制后变成abcdabcd,abcda成了子串,答案变成了0,所以如果当前串长l*2 >= 母串长,需要循环原串起始位置暴力即可。

Sure原创,转载请注明出处。

#include <iostream>
#include <cstdio>
#include <string.h>
#define MIN(a , b) ((a) < (b) ? (a) : (b))
using namespace std;
const int inf = 1 << 29;
const int maxn = 100002;
const int maxm = 12;
char str[maxn],dtr[maxn + maxm],dic[maxm][maxm],huan[maxm];
int dp[maxn + maxm][maxm];
int m,len,llen;

int CompareString(char *s1,char *s2,int l1,int l2)  //dp[i][j]表示s2前j位作为s1串前i位的字串,且匹配的编辑距离
{
    memset(dp,0,sizeof(dp));
    //for(int i=0;i<=l1;i++)  如果这四行加上,dp[i][j]表示的是s1串前i位与s2前j位的全部匹配的编辑距离
    //{
    //    dp[i][0] = i;
    //}
    for(int i=0;i<=l2;i++)
    {
        dp[0][i] = i;
    }
    for(int i=1;i<=l1;i++)
    {
        for(int j=1;j<=l2;j++)
        {
            int cost = (s1[i-1] == s2[j-1]) ? 0 : 1;
            dp[i][j] = MIN(dp[i-1][j-1] + cost , MIN(dp[i-1][j] + 1 , dp[i][j-1] + 1));
        }
    }
    int res = inf;
    for(int i=0;i<=l1;i++)
    {
        res = MIN(res , dp[i][l2]);
    }
    return res;
}

void solve()
{
    len = strlen(str);
    strcpy(dtr , str);
    for(int i=0;i<maxm;i++)
    {
        dtr[i+len] = str[i];
    }
    llen = len + maxm;
    dtr[llen] = '\0';
    scanf("%d",&m);
    getchar();
    int pos = -1,ans = inf;
    for(int i=0;i<m;i++)
    {
        scanf("%s",dic[i]);
        int l = strlen(dic[i]);
        if((l << 1) < len)
        {
            int tmp = CompareString(dtr , dic[i] , llen , l);
            if(tmp < ans || (tmp == ans && strcmp(dic[pos] , dic[i]) > 0))
            {
                ans = tmp;
                pos = i;
            }
        }
        else
        {
            for(int s=0;s<len;s++)
            {
                for(int j=0;j<len;j++)
                {
                    huan[j] = str[(s+j) % len];
                }
                huan[len] = '\0';
                int tmp = CompareString(huan , dic[i] , len , l);
                if(tmp < ans || (tmp == ans && strcmp(dic[pos] , dic[i]) > 0))
                {
                    ans = tmp;
                    pos = i;
                }
            }
        }
    }
    printf("%s %d\n",dic[pos],ans);
    return;
}

int main()
{
    while(~scanf("%s",str))
    {
        solve();
    }
    return 0;
}

编辑距离、拼写检查与度量空间:一个有趣的数据结构     除了字符串匹配、查找回文串、查找重复子串等经典问题以外,日常生活中我们还会遇到其它一些怪异的字符串问题。比如,有时我们需要知道给定的两个字符串“有多像”,换句话说两个字符串的相似度是多少。1965年,俄国科学家Vladimir Levenshtein给字符串相似度做出了一个明确的定义叫做Levenshtein距离,我们通常叫它“编辑距离”。字符串A到B的编辑距离是指,只用插入 阅读详情

相关推荐

游戏开发实战:5种AOI算法对比(九宫格 vs 灯塔 vs 十字链表)

本文深入对比了游戏开发中五种主流AOI算法(九宫格、灯塔、十字链表等)的性能与适用场景,帮助开发者根据项目规模选择最优解决方案。通过详细的技术分析和实战数据,揭示不同算法在万人同屏等极端场景下的表现差异,为MMORPG等大型多人在线游戏提供关键性能优化指南。

weixin_29268385的博客 443

HDU4271 Find Black Hand(编辑距离dp)

Problem Description I like playing game with my friends, although sometimes look pretty naive. Today I invent a new game called find black hand. The game is not about catching bad people but...

riba2534的博客 548

LIN总线从入门到精通:低成本汽车通信协议原理与实战

在汽车电子和嵌入式系统中,串行通信协议是实现分布式控制的关键技术。其中,LIN(Local Interconnect Network)总线作为一种专为低成本应用设计的单主多从网络协议,其核心原理在于通过简化的“领导-汇报”通信模式,在满足车身控制、传感器数据采集等场景需的同时,将硬件与布线成本降至最低。LIN总线采用标准化的帧结构,包含间隔场、同步场和受保护标识符场,并依赖调度表来管理通信时序,确保了网络的确定性与可靠性。其技术价值在于为车窗、座椅、灯光等非安全关键系统提供了高性价比的解决方案,是构建分层

weixin_29185167的博客 239

HDU 4271Find Black HandDP 编辑距离变种)

题意: 给定串长<=100000的母串和n(n<=10)且长度<=10的小串,问哪一个小串在母串中通过增加删除修改一个字母的操作数(即编辑距离)最小变成母串中的substring。母串是一个环。 最小的编辑距离,和对应字典序最小的字串。 分析: 比较明显的DP编辑距离的变种。破环,在最后加倍。 ...

dechi5213的博客 287

HDU 4271

字符串的编辑距离的扩展 //f[i,j]表示s[0...i]与t[0...j]的最小编辑距离。     f[i,j] = min { f[i-1,j]+1,  f[i,j-1]+1,  f[i-1,j-1]+(s[i]==t[j]?0:1) }     f[i-1,j]表示将s[i]删去,剩下是s[0...i-1]与t[0...j]的最小编辑距离; f[i][j-1]表示在s[i]后面

1292765944的专栏 1064

HDU - 4271(经典字符串dp改)

本题目就是给定最多是个小串,和一母串,f(i)为将母串做至少f(i)次修改产生子串si,min(f(i)) 但是母串是可以首位相连的。 那么如果母串长l1 >= 小串长l2 , 那么只需在母串后将首部十个拷贝到尾部,然后正常找f(i), l1 #include #include #include #include #include #include #define to fir

playwfun的专栏 580

hdu 4271 动态规划

思路:考的是字符串的编辑距离。在蓝桥杯2012年决赛上出现过。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[200050][20]; char targ[20],ans; int Min(int a,int b,int c) ...

weixin_30824479的博客 131

字符串编辑距离

leetcode 72. Edit Distance 一、问题描述 给定两个单词word1和word2,找到将word1转换为word2所需的最少操作次数。 对于某个单词,可以有以下3个操作: 1)插入一个字符 2)删除一个字符 3)替换一个字符 【举例】 例1: 输入: word1 = "horse", word2 = "ros" ...

qiki_糖没味儿的程序媛小屋 719

HDU 4323 编辑距离DP

Magic Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1333    Accepted Submission(s): 562 Problem Description There are many mag

liwei的专栏 840

HDU 4296 Buildings 公式证明贪心的正确性

题意:有n(1          现在想安排一种摆放方案使得max(PDVi)最小。 题解:现在考虑相邻的两块i j,设上方sigama(wi)  = sum,i 在 j上方时分别得到PDVi = sum - si,PDVj = sum + wi - sj,同理得到j在i上方时          PDVjj = sum - sj,PDVii = sum + wj - si,若i在j上方始终优

Uhh, call me zacky NOW!!! 1万+

HDU 4275 Color the Tree 树的不重复染色 树的中心+hash

题意:给定n(n 题解:这题完全是看人家的代码看懂的唉…          首先找到树的中心(不是重心),中心的定义是树的直径的中点,如果直径上节点个数是偶数,那么在中间建立一个新的节点。          然后从中心dfs,对于每一棵子树得到相应的hash值(hash方法:hash[i]= A * (hash[j1]*B)^hash[j2]*B.....^hash[jn]*C%D;(顺序执

Uhh, call me zacky NOW!!! 2477

HDU 4411 Arrest 最小费用流

题意:有n(0           i - 1 点,到达一个点的时候可以选择不占领,问最后 题解:floyd之后建图,因为要保证所有的点依次占领,所以每个点拆点流量为1费用为-inf(保证所有点都被占领),然后从j(j 费用为map[ j ][ i ]         (因为点的访问是要按照顺序的),然后从原点ss到i建容量为inf费用为map[0][i]的边,同理从i+n(i 拆的出边点)

Uhh, call me zacky NOW!!! 2047

HDU 4415 Assassin’s Creed 苦逼的贪心

题意:一个人有把耐久度为m(1          的刀,敌人死后留下的刀可以杀死bi个敌人而不费耐久度,问能最多杀多少人,且杀最多人的时候耐久度消耗最小的值。 题解:将敌人分成两类,一类是bi为0,一类不为0,只要能杀死一个bi不为0敌人就能得到所有的bi。          分两种情况:1 只杀bi=0的敌人,这种情况排序从ai小的开始杀即可;

Uhh, call me zacky NOW!!! 1290

HDU 4297 One and One Story 树lca转rmq 并查集维护根节点环

题意:给定一个有向图,每个节点只有一条出边,现在两个人在两个节点沿着有向边走,按照题意输出相遇时两个人走的路径。 题解:这个有向图很特别,由于每个节点只有一条出边,所以如果形成一个环的话就只能有指向这个环的边,同时一个子图内最多存在一个环,tarjan搞掉环,          建反图虚拟根节点转换成一棵树,根节点如果是环的环用带关系的并查集维护,然后lca->rmq,在线得到答案。

Uhh, call me zacky NOW!!! 1257

HDU 4281 Judges' response dp+tsp极致

题意:给定n(n          任意两点间的距离是ceil(sqrt((xi - xj) ^ 2 + (yi - yj) ^ 2))。          问题1:最少需要多少个裁判能完成所有选手的检查任务;          问题2(和问题1没有关系,只是在问题1有解的情况下):安排裁判数量任意多,完成任务的裁判走的最短时间和。 题解:对于问题1:考虑dp[i]表示i状态下完成任务的

Uhh, call me zacky NOW!!! 1205

HDU 4414 Finding crosses 暴力枚举

题意:在#o组成的n*n(3 题解:枚举每一个#假设其为一个合法十字架的中心位置即可。 Sure原创,转载请注明出处。 #include #include using namespace std; const int maxn = 52; const int move[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; char map[maxn][ma

Uhh, call me zacky NOW!!! 1171

HDU 4274 Spy's Work 树形dfs

题意:给定一棵节点为n(n           即u)w代表以u节点为根节点的员工权值和)w,问给定的m(m 题解:维护每棵子树的最大最小可能值(或者确定值,如果是 "=" 的话)。 Sure原创,转载请注明出处。 #include #include #include #define MIN(a , b) ((a) < (b) ? (a) : (b)) #define MAX

Uhh, call me zacky NOW!!! 1119

HDU 4272 LianLianKan 记忆化搜索

题意:长度为n(n 题解:dp[i][j]表示当前栈顶10个元素的状态为 i 栈顶深度为 j 时是否可行(1代表当前元素未选,0代表已选),转移很直观但dp方程不好写,记忆化dfs实现。          为什么是10个呢,可以想下,从开始的状态最坏的情况是每次栈顶的元素都取最远的,进行5次之后得到的状态是1010101010,未选择的元素恰好为5          总个数为10,所以需要记

Uhh, call me zacky NOW!!! 1104

HDU 4293 Groups 拓扑排序

题意:有n(n 题解:看这个题想应该是dp,若菜比赛的时候没想出来dp怎么搞,无奈只好yy了一个拓扑排序,开始因为没有处理好说相同话的情况wa了一次。          具体建图方法:所有合法的话,按照x升序y降序排列,枚举i j如果两个人说的话不矛盾建边,这里需要注意的是相同的话最多出现n - x - y次,          多余的直接删除,因为多余的一定是假话。然后拓扑排序找最长路。

Uhh, call me zacky NOW!!! 958

HDU 4409 Family Name List 简单树操作

题意:按照题目描述给一棵树(家族谱,节点n           c name name输出两个人的lca是多少(lca不能是name本身)。 题解:vector存储节点数这样很容易排序,然后保存下L的序列,sum[ i ]表示当前 i 节点的直接儿子节点的个数,rmq处理出lca。 Sure原创,转载请注明出处。 #pragma comment (linker , "/ST

Uhh, call me zacky NOW!!! 907
上一篇: HDU 4269 Defend Jian Ge 模拟
下一篇: HDU 4272 LianLianKan 记忆化搜索
zacky_su
博客等级 码龄14年 12粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值