题目大意:

输入样例个数,每个样例有两行,第一行是26个字母,分别代表a~z加密后的密文;第二行代表一串密文+明文,密文一定是完整的,但明文可能不完整,让你输出最短的(密文+明文);

基本思路:

拓展kmp,因为密文是完整的,所以它的长度必然是一半以上,所以把前一半转换成明文放到另一个数组里,然后后半部分原封不动的放到该数组里,然后拓展kmp,求一下next,然后从一半以后一直往后找,找到的话,就跳出,然后基本把把问题解决了;

代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. const int inf = 0x3f3f3f3f;
  9. const int maxn = 100000+10;
  10.  
  11. int nx[maxn],ex[maxn];
  12. char S[maxn],T[maxn];
  13. char s1[maxn],a[27],b[27];
  14. int lent,lens;
  15. void getNext(){
  16. nx[0]=lent;
  17. int j=0;
  18. while(j+1<lent&&T[j]==T[j+1]) j++;
  19. nx[1]=j;
  20. int k=1;
  21. for(int i=2;i<lent;i++){
  22. int p=k+nx[k]-1;
  23. int l=nx[i-k];
  24. if(i+l<p+1) nx[i]=l;
  25. else{
  26. j=max(0,p-i+1);
  27. while(i+j<lent&&T[i+j]==T[j]) j++;
  28. nx[i]=j;
  29. k=i;
  30. }
  31. }
  32. }
  33. /*
  34. void exkmp(){
  35. int j=0;
  36. while(j<lens&&j<lent&&S[j]==T[j]) j++;
  37. ex[0]=j;
  38. int k=0;
  39. for(int i=1;i<lens;i++){
  40. int p=k+nx[k]-1;
  41. int l=nx[i-k];
  42. if(l+i<p+1) ex[i]=-l;
  43. else{
  44. j=max(0,p-i+1);
  45. while(i+j<lens&&j<lent&&S[i+j]==T[j]) j++;
  46. ex[i]=j;
  47. k=i;
  48. }
  49. }
  50. }
  51. */
  52. int main(){
  53. int cas;
  54. scanf("%d",&cas);
  55. while(cas--){
  56. scanf("%s%s",a,s1);
  57. for(int i=0;i<26;i++) b[a[i]-'a']=i+'a';
  58. int len=strlen(s1);
  59. for(int i=0;i<(len+1)/2;i++) T[i]=b[s1[i]-'a'];
  60. for(int k=(len+1)/2;k<=len;k++) T[k]=s1[k];
  61. lent=strlen(T);
  62. getNext();
  63. int k;
  64. for(k=(len+1)/2;k<len;k++){
  65. if(nx[k]==len-k) break;
  66. }
  67. printf("%s",s1);
  68. for(int i=len-k;i<k;i++) printf("%c",b[s1[i]-'a']);
  69. printf("\n");
  70. }
  71. return 0;
  72. }

  

hdu 4300 拓展kmp的更多相关文章

  1. HDU 6153 拓展KMP (2017CCPC)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  2. HDU - 4300 Clairewd’s message (拓展kmp)

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

  3. HDU 4300 Clairewd's message ( 拓展KMP )

    题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...

  4. HDU - 3613 Best Reward(manacher或拓展kmp)

    传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...

  5. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

  6. HDU 3613 Best Reward(拓展KMP算法求解)

    题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...

  7. Simpsons’ Hidden Talents HDU - 2594(拓展kmp)

    Sample Input clinton homer riemann marjorie Sample Output 0 rie 3 看输出才题意...拓展kmp特征很明显嘛....注意开始就匹配到尾的 ...

  8. HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )

    题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...

  9. HDU 6153 A Secret ( KMP&&DP || 拓展KMP )

    题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...

随机推荐

  1. Welcome to MarkdownPad 2

    Welcome to MarkdownPad 2 MarkdownPad is a full-featured Markdown editor for Windows. Built exclusive ...

  2. java集合类笔试选择题整理含答案

    1.ArrayList list=new ArrayList(20);中的list扩充几次()A. 0B. 1C. 2D. 3答案:A分析:已经指定了长度, 所以不扩容 2.List.Set.Map哪 ...

  3. oracle trim无效?

    这里说说如果是全角空格怎么去除 方法一 trim(TO_SINGLE_BYTE('aaa')) 方法二 SELECT TRIM(replace('aaa',' ','')) FROM dual

  4. 【leetcode】1003. Check If Word Is Valid After Substitutions

    题目如下: We are given that the string "abc" is valid. From any valid string V, we may split V ...

  5. php time()函数 语法

    php time()函数 语法 time()函数怎么用? php time()函数用来返回当前时间的unix时间戳.语法是time(),返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 ...

  6. lnmp 一键安装详解

    1.使用putty或类似的SSH工具登陆VPS或服务器: 登陆后运行:screen -S lnmp 如果提示screen: command not found 命令不存在可以执行:yum instal ...

  7. vue2 打包部署(vue-cli )

    1.一般打包 :直接 npm run build.(webpack的文件,根据不同的命令,执行不同的代码的) 注:这种打包的静态文件,只能放在web服务器中的根目录下才能运行. 2.在服务器中 非根目 ...

  8. 如何让EditText不能自动获取焦点(转)

    转载地址:http://blog.csdn.net/subaohao/article/details/9043895 在activity中放置了1个或1个以上的EditText,进入该activity ...

  9. redis shell命令

    APPEND key value追加一个值到key上 AUTH password验证服务器 BGREWRITEAOF异步重写追加文件 BGSAVE异步保存数据集到磁盘上 BLPOP key [key ...

  10. 优化问题及KKT条件

    整理自其他优秀博文及自己理解. 目录 无约束优化 等式约束 不等式约束(KKT条件) 1.无约束优化 无约束优化问题即高数下册中的 “多元函数的极值"  部分. 驻点:所有偏导数皆为0的点: ...