HDU 4300 暴力水過
題意:給出一個26位的字母對照表,再給一段密文+明文(密文按照對照表翻譯好的)的字符串,前麵是明文後麵是密文,而且密文一定完整明文可能不完整。讓你把密文還原,還有個條件是密文盡可能短的,先輸出密文輸出明文。
因為密文完整明文可能不完整所以最短的情況也就行一半密文一半明文了,所以就先把這段文字按照表翻譯成明文,在從頭與給出的字符串的後半部分比較,對上了就說明是原串在這之前的部分是密文。
qwertabcde
(翻譯後)abced.....
這樣qwert就是密文,再把qwert翻譯成明文就可以了。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; #define N 100005 char yl[30],data[N],data1[N],data2[N>>1]; int main() { map<char,char>mymap; int t; scanf("%d",&t); while(t--) { mymap.clear(); scanf("%s%s",yl,data); for(int i=0; i<26; i++) mymap[yl[i]]='a'+i; int len=strlen(data),len1=len%2?len/2+1:len/2; for(int i=0; i<len1; i++) data1[i]=mymap[data[i]]; for(int i=len1,j=0; i<len; i++,j++) data2[j]=data[i]; int j=0; for(int i=0; i<len-len1; i++) { for(j=0; j+i<len-len1; j++) if(data1[j]!=data2[i+j]) break; if(i+j>=len-len1) break; } for(int i=0; i<len-j; i++) printf("%c",data[i]); for(int i=0; i<len-j; i++) printf("%c",mymap[data[i]]); puts(""); } return 0; }
最後更新:2017-04-03 18:51:59