hdu1287 破译密码

题意:

破译密码

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

#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;
}
      



原文地址:https://www.cnblogs.com/csnd/p/12063208.html