hdu 4300 Clairewd’s message
2016-07-12 10:46
531 查看
题意:首先给你一个a-z的转换表,然后给你给一个密文+明文的串(明文可能不完整),密文一定完整,所以取原串的一半,前半段一定是密文,保存后半段,然后对原串翻译,在用后半段与翻译后的串匹配记录最后匹配的位置,然后用总长度减去记录的那个位置就是要补上的部分。
解法:kmp的应用;
解法:kmp的应用;
#include<stdio.h> #include<string.h> int next[100005],n,m; void mn(char *s) { next[0]=-1; int k=-1,j=0; while(j<n) { if(k==-1||s[j]==s[k]) { k++; j++; if(s[j]==s[k]) next[j]=next[k]; else next[j]=k; } else k=next[k]; } } int kmp(char *s,char *t) { int i=0,j=0; while(i<m&&j<n) { if(j==-1||s[i]==t[j]) { i++; j++; if(i==m) return j; } else j=next[j]; } return 0; } int main() { char str[100005],s1[100005],s2[100005]; int t; scanf("%d",&t); while(t--) { scanf("%s %s",str,s1); printf("%s",s1); n=strlen(s1); strcpy(s2,s1+(n+1)/2); m=strlen(s2); for(int i=0;s1[i];i++) for(int j=0;j<26;j++) if(str[j]==s1[i]) { s1[i]='a'+j; break; } mn(s1); int pos=kmp(s2,s1); for(int i=pos;i<n-pos;i++) printf("%c",s1[i]); printf("\n"); } return 0; }
相关文章推荐
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- HDU 1016 Prime Ring Problem
- HDU 1017 A Mathematical Curiosity