题目链接:点击查看

题目大意:给出两个字符串 s 和 t ,字符串 s 代表着一种密码的映射,字符串 t 代表着一段密文+明文,题目保证密文是完整的,但明文只有一部分,现在问如何补全字符串 t ,使得字符串 t 的前半部分是密文,后半部分是明文,且明文和密文所表达的字符串经过密码映射后是一致的,且满足补齐后的字符串 t 的长度最短

题目分析:因为要保证前后一致且最短,那么就挑选的位置尽可能靠前且满足字符串 t 的后缀与前缀相等,说道后缀与前缀相等,那就可以直接用扩展KMP来解决了,求出extend数组后,找到一个位置 i ,满足 i +extend[ i ] >=len ,且 i >=extend[ i ],第一个满足这两个条件的位置就是切割位置了,找到这个位置之后就可以直接输出了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100; //字符串长度最大值int Next[N],extend[N];char s[N],t[N];unordered_map<char,char>decode;//预处理计算Next数组
void getNext(char str[])
{int i=0,j,po,len=strlen(str);Next[0]=len; //初始化Next[0]while(str[i]==str[i+1] && i+1<len) i++; Next[1]=i; //计算Next[1]po=1; //初始化po的位置for(i=2;i<len;i++){if(Next[i-po]+i < Next[po]+po) //第一种情况,可以直接得到Next[i]的值Next[i]=Next[i-po];else //第二种情况,要继续匹配才能得到Next[i]的值{j = Next[po]+po-i;if(j<0) j=0; //如果i>po+Next[po],则要从头开始匹配while(i+j<len && str[j]==str[j+i]) j++; Next[i]=j;po=i; //更新po的位置}}
}//计算extend数组
void EXKMP(char s1[],char s2[])
{int i=0,j,po,len=strlen(s1),l2=strlen(s2);getNext(s2); //计算子串的Next数组while(s1[i]==s2[i] && i<l2 && i<len) i++; extend[0]=i;po=0; //初始化po的位置for(i=1;i<len;i++){if(Next[i-po]+i < extend[po]+po) //第一种情况,直接可以得到extend[i]的值extend[i]=Next[i-po];else //第二种情况,要继续匹配才能得到extend[i]的值{j = extend[po]+po-i;if(j<0) j=0; //如果i>extend[po]+po则要从头开始匹配while(i+j<len && j<l2 && s1[j+i]==s2[j]) j++; extend[i]=j;po=i; //更新po的位置}}
}void init()
{decode.clear();char str[30];scanf("%s",str);for(int i=0;i<26;i++)decode[str[i]]='a'+i;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){init();scanf("%s",s);//原码 = 密文 + 明文int n=strlen(s); for(int i=0;i<n;i++)t[i]=decode[s[i]];//全部解密后的明文 getNext(s);EXKMP(s,t);int ans=n;for(int i=0;i<n;i++)if(i+extend[i]>=n&&i>=extend[i])//i为密文长度,extend[i]为明文长度{ans=i; break;}for(int i=0;i<ans;i++)putchar(s[i]);for(int i=0;i<ans;i++)putchar(decode[s[i]]);putchar('\n');}return 0;
}

HDU - 4300 Clairewd’s message(扩展KMP)相关推荐

  1. HDU 4300 Clairewd’s message

    一道KMP的变式 本题仍是求最大前缀后缀,所以仍用KMP,但不同的是,本题有一个密码转换规则,不过好在题目中说了两段不重合,那么我们就可以在中间插入一个特殊符号'*'',保证求next数组时不会越过中 ...

  2. 一些扩展kmp的总结

    花了一天多时间学了下ex_kmp.... 可以看刘雅琼的ppt,讲的非常清楚: 下载地址:http://url.cn/Rvjxa9 ex_kmp可以在线性时间内求文本串的每个位置与模板串的最大公共前缀 ...

  3. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  4. HDU 3613 Best Reward 正反两次扩展KMP

    题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...

  5. HDU - 4333 Revolving Digits(扩展KMP)

    题目链接:点击查看 题目大意:给出一个由 n 个数位组成的数字,现在可以通过将其不同的后缀移到前面来组成 n 个新的数字,现在要求出 n 个新数字进行去重后,有多少个新数字分别大于.等于.小于原数字 ...

  6. HDU - 6629 string matching(扩展KMP)

    题目链接:点击查看 题目大意:给出一个字符串 s 和一个暴力程序,用于求解 s 的每个后缀和原字符串的最长公共前缀,现在问一共需要执行多少次比较操作 题目分析:首先肯定不能暴力去模拟,时间复杂度n*n ...

  7. HDU - 6153 A Secret(KMP的next数组性质/扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串a和b,我们首先定义L:字符串b当前的后缀子字符串长度,N:字符串b当前的后缀在字符串a中出现的次数,现在询问,对于字符串b的每一个后缀,求出L*N之和,答 ...

  8. Oulipo HDU - 1686 (使用扩展kmp进行讨伐!)

    题目链接 题意:给你两个字符串s,t.让你求在s中t出现了多少次. 解题思路: kmp做法点这里 使用扩展kmp.构建一个新字符串k=t+▲+s ▲为分隔符,保证不会影响s求z函数. 对k使用扩展km ...

  9. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一   ...

最新文章

  1. oracle exists 变量,Num58 Oracle总结
  2. 测试HAPROXY的文件分流办法
  3. void init(void) 分析 ! \linux-1.0\init\main.c
  4. 第四十六章:SpringBoot RabbitMQ完成消息延迟消费
  5. neo4j 删 delete
  6. Ubuntu-20.04开机黒屏出现“dev/sda ... clean ... blocks”的信息
  7. Mybatis3 最简例子
  8. ntfsdos pro v5.0
  9. 对入门使用者比较友好的视频剪辑工具推荐
  10. 渗透测试 QA 收集
  11. win7计算机系统减肥,win7系统怎么瘦身?教您系统瘦身方法
  12. 硬件基础-开尔文电桥法
  13. 优雅的备份博客内的外链图片
  14. B. Shifting Sort(rotate函数旋转应用)
  15. docker下运行分布式代码报nccl错误:connect returned Connection timed out,成功解决
  16. 支付宝、微信、银联三种支付平台链接
  17. 系统认证风险预测方案总结
  18. 【C】39.程序中的三国天下
  19. RecyclerView点击删除条目imageloader图片获取
  20. NRF52832与NRF52840的性能区别

热门文章

  1. Redis的session管理和Memcached的session管理不同
  2. RPC实现Provider服务端业务逻辑
  3. 动态数据源切换的底层原理-DynamicDataSourceEntry
  4. TransactionAwareDataSourceProxy
  5. 注解能力ApplicationContext作为 IoC 容器示例
  6. Spring集成web环境步骤
  7. canal数据同步(客户端代码编写)
  8. 方法级权限控制-@Secured注解使用
  9. 前端框架:执行流程分析之路由与菜单
  10. 数据库-事务-事务的特征