给两个串第一个串是翻译表(密文可以通过翻译表翻译成明文),第二个串是由密文+明文组成,前面是密文(完整的),后面是明文(未必完整),问能不能把第二个串补全,输出最短的一种可能。

一开始 用的string   和每次更新字符进行getnext

妥妥的 超时   kmp最好不要用string  速度太慢了

参考了 kuangbin的做法:

以s为原串做一次扩展KMP,得到extend数组,extend[i]表示原串以第i开始与模式串的前缀的最长匹配。经过O(n)的枚举,我们可以得到,若extend[i]+i=len且i>=extend[i]时,表示stringB即为该点之前的串,stringA即为该点之前的str串,最后输出即可。

就是原串和翻译后的串进行一次ekmp  然后进行判断输出即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input by bxd
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define RI(n) scanf("%d",&(n))
  6. #define RII(n,m) scanf("%d%d",&n,&m)
  7. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  8. #define RS(s) scanf("%s",s);
  9. #define LL long long
  10. #define REP(i,N) for(int i=0;i<(N);i++)
  11. #define CLR(A,v) memset(A,v,sizeof A)
  12. //////////////////////////////////
  13. #define inf 0x3f3f3f3f
  14. #define N 100000+50
  15. int nex[N];
  16. int extend[N];
  17. char p[N];
  18. char s[N];
  19. char table[N];
  20. map<char,char>mp;
  21. void EKMP(char s[],char t[])//s[]为主串,t[]为模式串
  22. {
  23. int i,j,p,l;
  24. int len=strlen(t);
  25. int len1=strlen(s);
  26. memset(nex,,sizeof(nex));
  27. memset(extend,,sizeof(extend));
  28. nex[]=len;
  29. j=;
  30. while(j+<len&&t[j]==t[+j])j++;
  31. nex[]=j;
  32. int a=;
  33. for(int i=;i<len;i++)
  34. {
  35. p=nex[a]+a-;
  36. l=nex[i-a];
  37. if(i+l<p+)nex[i]=l;
  38. else
  39. {
  40. j=max(,p-i+);
  41. while(i+j<len&&t[i+j]==t[+j])j++;
  42. nex[i]=j;
  43. a=i;
  44. }
  45. }
  46. j=;
  47. while(j<len1&&j<len&&s[j]==t[j])j++;
  48. extend[]=j;
  49. a=;
  50. for(i=;i<len1;i++)
  51. {
  52. p=extend[a]+a-;
  53. l=nex[i-a];
  54. if(l+i<p+)nex[i]=l;
  55. else
  56. {
  57. j=max(,p-i+);
  58. while(i+j<len1&&j<len&&s[i+j]==t[j])j++;
  59. extend[i]=j;
  60. a=i;
  61. }
  62. }
  63. }
  64.  
  65. int main()
  66. {
  67. int cas;
  68. RI(cas);
  69. while(cas--)
  70. {
  71. RS(table);
  72. RS(s);
  73. rep(i,,)
  74. mp[table[i]]='a'+i;
  75. int len=strlen(s);
  76. rep(i,,len-)
  77. p[i]=mp[ s[i] ];
  78. EKMP(s,p);
  79. int k;
  80. for(k=(len+)/;k<len;k++)
  81. {
  82. if(extend[k]+k>=len)//+k 意为当前坐标之前有几个字母 直接为k即可
  83. break;
  84. }
  85. rep(i,,k-)
  86. printf("%c",s[i]);
  87. rep(i,,k-)
  88. printf("%c",mp[s[i]]);
  89. cout<<endl;
  90. }
  91. return ;
  92. }

Clairewd’s message ekmp的更多相关文章

  1. hdu------(4300)Clairewd’s message(kmp)

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. hdu 4300 Clairewd’s message KMP应用

    Clairewd’s message 题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文).之后给你一串长度为n<= 100000的前 ...

  3. HDU-4300 Clairewd’s message

    http://acm.hdu.edu.cn/showproblem.php?pid=4300 很难懂题意.... Clairewd’s message Time Limit: 2000/1000 MS ...

  4. hdu4300 Clairewd’s message【next数组应用】

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. (KMP 扩展)Clairewd’s message -- hdu -- 4300

    http://acm.hdu.edu.cn/showproblem.php?pid=4300 Clairewd’s message Time Limit: 2000/1000 MS (Java/Oth ...

  6. hdu4300 Clairewd’s message

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=4300 题目: Clairewd’s message Time Limit: 2000/1000 MS (J ...

  7. hdu 4300 Clairewd’s message 字符串哈希

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. hdu4300 Clairewd’s message 扩展KMP

    Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...

  9. Clairewd’s message

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

随机推荐

  1. 一个完整Java Web项目背后的密码

    前言 最近自己做了几个Java Web项目,有公司的商业项目,也有个人做着玩的小项目,写篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正接触过完整Java ...

  2. Centos7 设置静态IP地址

    一:  修改网卡配置文件(操作前先备份一下该文件),/etc/sysconfig/network-scripts/ 具体操作如下: 1:进入修改目录 [root@localhost ~]# clear ...

  3. Confluence 6 附件存储文件系统的分级

    从 Confluence 3.0 开始,附件的存储方式有了重大的改变和升级.如果你是从 Confluence 2.10 及其早期版本升级上来的,请参考 Upgrading Confluence 页面中 ...

  4. laravel 表单方法伪造

    有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET 和 POST 两种方式,如果要使用其他的方式,则需要自己来定义实现. HTTP 请求方式概述 最 ...

  5. Kali linux Nessus &Cracking Password

    1 .Nessus漏洞网站测试(真正体会到什么是专业版和社区版的区别,要技术就不光要勤恳的态度,严谨的思维.还有矢志不渝的志气,还必须要求砸钱,所以狠狠的赚钱才是硬道理),我的半个社区版的很多扫描模块 ...

  6. Java 把一个文本文档的内容复制到另一个文本文档

    src.txt放在工程目录下,dest.txt可创建,也可不创建.一旦运行程序,如果dest.txt不存在,将自行创建这个文本文档,再将src.txt中的内容复制到dest.txt import ja ...

  7. centos--git搭建之Gogs安装

    1.下载git yum intall -y git 2. 创建git用户(必须新创建git用户, 用root用户会导致无法下载) #创建git用户 sudo adduser git #给git用户设置 ...

  8. Windows Internals 笔记——线程局部存储区

    1.由于C/C++运行库是在多线程应用程序出现的许多年前设计的,因此运行库中的大多数函数是为单线程应用程序设计的. 2.当应用程序第一次调用_tcstok_s的时候该函数将传入的字符串地址保存在它自己 ...

  9. CPU虚拟化

    1. 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件.  Ring 是 ...

  10. JS实现简单的观察者模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...