题意:说实话这个题的题意还真的挺难懂的,我开始看了好久都没看懂,后来百度了下题意才弄懂了,这题的意思就是首先有一个字母的转换表,就是输入的第一行的字符串,就是'a'转成第一个字母,'b'转成转换表的第二个字母·······然后下面一个字符串是密文+明文的形式的字符串。就是说前后两段是重复的,只不过通过转换表转换了下。而且后面一段可能不完整,让我们补完整。

思路:这道题我很久之前就已经a掉了,当时是用普通的kmp做的,稍微变通下就行了。只不过现在正在学习扩展kmp,所以就用扩展kmp做了下,个人觉得普通的kmp还好一点,代码短也容易理解。

我现在讲两种方法:

第一种、普通的kmp首先题目中输入的字符串:密文+明文,假设该字符串为s1,第一步:把s1全部翻译一遍变成:明文+密文,假设该字符串为s2;第二步:我们以s1的后半段为主串,以s2为模式串进行kmp即可。

代码实现:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. char a[],c[];
  5. int next[];
  6. int main()
  7. {
  8. int T,i,j,len,nima[],mid;
  9. char b[];
  10. while(scanf("%d",&T)!=EOF)
  11. {
  12. getchar();
  13. while(T--)
  14. {
  15. scanf("%s%s",b+,a+);
  16. for(i=;i<=;i++)
  17. nima[b[i]-'a']=i-;
  18. len=strlen(a+);
  19. for(i=;i<=len;i++)
  20. c[i]='a'+nima[a[i]-'a'];
  21. i=;j=;next[]=;
  22. while(i<len)
  23. {
  24. if(j==||c[i]==c[j])
  25. {
  26. i++;j++;
  27. next[i]=j;
  28. }
  29. else
  30. j=next[j];
  31. }
  32. if(len%==)
  33. i=len/+;
  34. else
  35. i=len/+;
  36. j=;mid=i;
  37. while(i<=len)
  38. {
  39. if(j==||a[i]==c[j])
  40. {
  41. i++;j++;
  42.  
  43. }
  44. else
  45. j=next[j];
  46. }
  47. for(i=;i<=len;i++)
  48. printf("%c",a[i]);
  49. for(i=j;i<j+len-*j+;i++)
  50. printf("%c",c[i]);
  51. printf("\n");
  52. }
  53. }
  54. return ;
  55. }

第二种、扩展kmp,首先题目中输入的字符串:密文+明文,假设该字符串为s1,第一步:把s1 的后半段翻译译一遍变成:假设该字符串为s2;第二步:以s1为主串,s2为模式串进行一次扩展kmp,得到extend数组;第三步:对extend数组进行一次扫描,如果主串某一位置的后缀与模式串的前缀全部匹配就立即停止,这一位置就是满足的最优解了。

代码实现:

  1. #include<stdio.h>
  2. #include<string.h>
  3. char str1[],T[];
  4. char s1[],S[];
  5. int next[],extend[];
  6. void get_next()
  7. {
  8. int len=strlen(T),j,a,k,p,L;
  9. next[]=len;
  10. a=;
  11. while(a<len-&&T[a]==T[a+])
  12. a++;
  13. next[]=a;
  14. a=;
  15. for(k=;k<len;k++)
  16. {
  17. p=a+next[a]-;
  18. L=next[k-a];
  19. if(k+L->=p)
  20. {
  21. j=p-k+>?p-k+:;
  22. while(j+k<len&&T[j+k]==T[j])
  23. j++;
  24. next[k]=j;
  25. a=k;
  26. }
  27. else
  28. next[k]=L;
  29. }
  30. }
  31. void get_extend()//S为主串,T为模式串
  32. {
  33. int len1,len2,len,j,k,a,p,L;
  34. get_next();
  35. len1=strlen(S);
  36. len2=strlen(T);
  37. len=len1>len2?len2:len1;
  38. a=;
  39. while(a<len&&S[a]==T[a])
  40. a++;
  41. extend[]=a;
  42. a=;
  43. for(k=;k<len1;k++)
  44. {
  45. p=a+extend[a]-;
  46. L=next[k-a];
  47. if(k+L->=p)
  48. {
  49. j=p-k+>?p-k+:;
  50. while(j+k<len1&&j<len2&&S[j+k]==T[j])
  51. j++;
  52. extend[k]=j;
  53. a=k;
  54. }
  55. else
  56. extend[k]=L;
  57. }
  58. }
  59. int main()
  60. {
  61. int t,i,len,mid,max,len1;
  62. while(scanf("%d",&t)!=EOF)
  63. {
  64. getchar();
  65. while(t--)
  66. {
  67. max=-;
  68. scanf("%s",str1);
  69. scanf("%s",T);
  70. for(i=;i<;i++)
  71. s1[str1[i]-'a']=i+'a';
  72. len=strlen(T);
  73. if(len%==)
  74. mid=len/;
  75. else
  76. mid=len/+;
  77. for(i=mid;i<len;i++)
  78. S[i-mid]=str1[T[i]-'a'];
  79. S[i-mid]='\0';
  80. get_extend();
  81. len=strlen(S);
  82. len1=strlen(T);
  83. for(i=;i<len;i++)
  84. if(i+mid+extend[i]==len1)
  85. {
  86. max=extend[i];
  87. break;
  88. }
  89. printf("%s",T);
  90. if(max==-)
  91. max=;
  92. len=strlen(T);
  93. for(i=max;i<len-max;i++)
  94. printf("%c",s1[T[i]-'a']);
  95. printf("\n");
  96. }
  97. }
  98. return ;
  99. }

hdu 4300(kmp)的更多相关文章

  1. hdu 4300 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)

    HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...

  3. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  4. Cyclic Nacklace HDU 3746 KMP 循环节

    Cyclic Nacklace HDU 3746 KMP 循环节 题意 给你一个字符串,然后在字符串的末尾添加最少的字符,使这个字符串经过首尾链接后是一个由循环节构成的环. 解题思路 next[len ...

  5. hdu 4300 Clairewd’s message(具体解释,扩展KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 Problem Description Clairewd is a member of FBI. ...

  6. hdu 4300 Clairewd’s message KMP应用

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

  7. (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 ...

  8. HDU 4300 Clairewd’s message(KMP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 题目大意:题目大意就是给以一段字符xxxxzzz前面x部分是密文z部分是明文,但是我们不知道是从 ...

  9. hdu 4300 Clairewd’s message(扩展kmp)

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

随机推荐

  1. C++ char*,const char*,string,int 的相互转换

    C++ char*,const char*,string,int 的相互转换   1. string转const char* string s ="abc";const char* ...

  2. Pyp 替代sed,awk的文本处理工具

    Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...

  3. HDU 1598 find the most comfortable road(枚举+并查集,类似于最小生成树)

    一开始想到用BFS,写了之后,发现有点不太行.网上查了一下别人的解法. 首先将边从小到大排序,然后从最小边开始枚举,每次取比它大的边,直到start.end属于同一个集合,即可以连通时停止.过程类似于 ...

  4. 使用git代替FTP部署代码到服务器的例子

    这篇文章主要介绍了使用git代替FTP部署代码到服务器的例子,这种方法可以节省流量.节省时间,需要的朋友可以参考下 本地开发完成后,通常会在服务器上部署,有人会使用ftp,有人会使用scp, ftp和 ...

  5. **使用 Git Hook 实现网站的自动部署

    http://www.tuicool.com/articles/3QRB7jU 自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生.不知道大家平时都是怎么样更新自 ...

  6. Oracle 9 - 分析undo和snapshot too old错误

    什么操作会生成undo INSERT生成的UNDO最少,只要记录新的rowid UPDATE生成的undo多一点,它要记录修改前的数据中的那部分. DELETE生成最多的undo, 因为它要记录整行被 ...

  7. 快速学习bootstrap前台框架

    W3c里的解释 使用bootstrap需要注意事项 1.  在html文件第一行要加上<!doctype html>[s1] 2.  导入bootstrap.min.css文件 3.  导 ...

  8. 核心思想:百度网盘怎么盈利(互联网的高速更新决定了:亏钱你还有点机会,放弃连门都进不了),战略预备队 good

    百度做网盘很大程度就是为了防止别人依靠网盘做大和积累点技术储备.腾讯邮箱怎么赚钱?腾讯影音怎么赚钱?互联网的高速更新决定了,一些你看不起眼的软件很可能就会席卷整个市场,所以互联网大佬宁愿一些项目亏钱也 ...

  9. CentOS安装VSFTP及配置用户

    第一步,安装vsftp # 1.以管理员(root)身份执行以下命令 yum install vsftpd # 2.设置开机启动vsftpd ftp服务 chkconfig vsftpd on # 3 ...

  10. Intellij IDEA新建一个EJB工程(二)

    从博文:http://www.cnblogs.com/yangyquin/p/5328344.html 中可以知道如何利用Intellij IDEA建立一个EJB Module,还有新建一个测试Mod ...