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

一开始 用的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. 【原创】大数据基础之Flume(2)应用之kafka-kudu

    应用一:kafka数据同步到kudu 1 准备kafka topic # bin/kafka-topics.sh --zookeeper $zk:2181/kafka -create --topic ...

  2. adb ( Android Debug Bridge)

    adb ( Android Debug Bridge) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试应用. adb工具的工 ...

  3. 分页插件pagination.js

    项目中有分页功能,之前都是自己写,样式不好看,功能也简单,就找了这个插件pagination.js 页面导入pagination.js html代码 <div class="list_ ...

  4. css3 自定义滚动条样式

    ::-webkit-scrollbar :滚动条整体部分 ::-webkit-scrollbar-thumb :滚动条里面的小方块样式 ::-webkit-scrollbar-track 滚动条的轨道 ...

  5. Android&Java面试题大全—金九银十面试必备

    声明本文由作者:Man不经心授权转载,转载请联系原文作者原文链接:https://www.jianshu.com/p/375ad14096b3, 类加载过程 Java 中类加载分为 3 个步骤:加载. ...

  6. 使用 Jira 和 Confluence 6 在一起

    这个过程是有趣的过程.请参考 Use Jira applications and Confluence together 文档来找到有关整合的相关内容,能够在后续的开发中更多的节省时间,以及你需要安装 ...

  7. java多线程快速入门(十九)

    如何停止线程 1.使用stop方法强行终止线程(这个方法不推荐使用,可能会出现业务操作未执行完,线程中断了) package com.cppdy; class MyThread15 extends T ...

  8. doy09 文件处理,拷贝文件

    一\在python中打开文件,得到文件语句并赋值给一个变量 f=open('a.txt','r',encoding='utf-8'))  默认打开模式就为r: 2.通过句柄对文件进行操作 data=f ...

  9. JavaScript(JS)之简单介绍

    一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) N ...

  10. bzoj 4011

    看了好多篇题解才看懂的题,我实在太菜了... 首先根据一个我不知道的算法,可以证明在没有加入新的边的时候,原图的所有生成树的方案数就是所有点(除1以外)的度之积 那么在新加入这条边之后,我们仍然可以这 ...