思路:异或运算的运用,破译密码时一定存在一个大写字母使得所有的原文在'A'~'Z'之内。

异或运算法则:  
      1. a ^ b = b ^ a 
  2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c; 
  3. d = a ^ b ^ c  可以推出 a = d ^ b ^ c. 
  4. a ^ b ^ a = b.  相关链接(http://acm.hdu.edu.cn/showproblem.php?pid=1287)

CODE:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

const int maxn = 1001;
int a[maxn];

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        int i, j;
        int tmp;
        for(i = 0 ; i < n; ++i) scanf("%d", &a[i]);
        for(i = 0+'A'; i <= 0+'Z'; i++)
        {
            for(j = 0; j < n; j++)
            {
                char c = a[j]^i;
                if(c < 'A' || c > 'Z')
                {
                    break;
                }
            }
            if(j == n)
            {
                tmp = i;
                break;
            }
        }
        for(i = 0 ; i < n; i++)
        {
            printf("%c", a[i]^tmp);
        }
        printf("\n");
    }
    return 0;

} 

posted on 2012-07-18 13:30  有间博客  阅读(378)  评论(1编辑  收藏  举报