题意:
破译密码
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3227 Accepted Submission(s): 1452
Problem Description
有个叫“猪头帮”的国家,采用一种简单的文法加密,他们所用的语言里面只有大写字母,没有其他任何字符;现在还知道他们加密的方法是:只用一个大写字母和原文进行异或运算生成密文。请你帮忙解开。
Input
有若干组,每组输入有2行,第一行整数N表示有N个密文,接着一行有N个整数分别表示N个密文。
Output
输出仅有大写字母组成的原文。
Sample Input
30
17 6 9 8 3 0 1 6 7 4 5 10 11 8 9 14 15 12 13 18 19 16 17 22 23 20 21 26 27 24
Sample Output
SDKJABCDEFGHIJKLMNOPQRSTUVWXYZ
思路:
首先明确一点就是,既然是密码传输,估计是只能传输加密的东西,不能传输真实的东西,所以该题目的测试数据应该给的是只有一种破译方式的数据,(这个是我自己猜的,不然没办法做,他也没写特判),对于异或 有这样的规律 a^b^b = a;所以直接暴力枚举他的加密异或字母,当所有的都是大写字母的时候就ok了...没说n多大,我开的是10W
首先明确一点就是,既然是密码传输,估计是只能传输加密的东西,不能传输真实的东西,所以该题目的测试数据应该给的是只有一种破译方式的数据,(这个是我自己猜的,不然没办法做,他也没写特判),对于异或 有这样的规律 a^b^b = a;所以直接暴力枚举他的加密异或字母,当所有的都是大写字母的时候就ok了...没说n多大,我开的是10W
#include<stdio.h> int num[100000]; int ans[100000]; int main () { int n ,i ,j; while(~scanf("%d" ,&n)) { for(i = 1 ;i <= n ;i ++) { scanf("%d" ,&num[i]); } for(i = 1 ;i <= 26 ;i ++) { for(j = 1 ;j <= n ;j ++) { ans[j] = num[j] ^ i; if(ans[j]<=0 || ans[j] > 26) break; } if(j == n + 1) break; } for(i = 1 ;i <= n ;i ++) printf("%c" ,ans[i] + 64); printf(" "); } return 0; }