HDU-4300:Clairewd’s message(最长前后缀匹配问题kmp做法)

题目链接

题目大意:题目给你两个串,第一个串是翻译串。第二个串是一个由密文和明文组成的串,密文一定是完整的而明文不一定甚至可能没有。最后让你输出完整的密文+明文串。

解题思路:
我们首先把给出的字符串str全部翻译成明文,保存在字符串pattern中(为什么取这个名字等下有说明,先记一下)。(str仍保留初始字符)
再由题意密文全部给出可知,str中至少前面一半的字符是密文,后面一半存在一个最长后缀是明文(这个后缀也可以为空串),我们把后半段str全部存在字符串s中。
此时我们有3个字符串: 1.str 保存题目给的原始密文
2.pattern保留str翻译一遍的字符(密文变成了明文,明文变成了其他不用管的字符)
3.s 保存str中后半段字符
接下来只需要找出s满足与str的前缀匹配的最长后缀,这个长度length就是str后半段包含的明文字符数目,比如 str=abcdeab ,pattern=abcd×××(后三个不用管),s=eab ,则s满足要求的后缀就是ab,length=2,就可知还剩4-2个(4是str的一半)明文没有输出。
而要找到s满足与str的前缀匹配的最长后缀是经典的exkmp算法问题,但是这里我们也可以用kmp算法求解 。
方法一、 在s中找pattern的匹配串(它们的名字就是这样取的qaq),经典kmp算法,但是这里s长度是小于pattern的,所以最终s的指针走完了,pattern的指针走过的长度就是最长匹配后缀length
方法二、把pattern,s拼接起来(new_str=pattern+s,len=new_str.size() ),求出new_str的next数组,next[len-1]就是length,但是如果next[len-1]大于s或的pattern的长度,需要回溯使之不大于,具体见代码

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#define MAX 200500
using namespace std;
//把初始字符串str翻译一遍成字符串pattern,同时把初始str后一半拿出来给s,用pattern去匹配s,s为主串,返回能匹配到的最长长度

int f1(string s,string pattern)//s后缀  pattern前缀,拼起来利用kmp的match数组
{
   
    string str=pattern+s;//拼接起来求match数组
    int match[MAX];
    match[0]=-1;
    int len=(int)str.size();
    for(int i=1;i<len;i++)
    <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值