首页 > ACM题库 > HDU-杭电 > HDU 1287 破译密码-枚举-[解题报告] C++
2013
12-04

HDU 1287 破译密码-枚举-[解题报告] C++

破译密码

问题描述 :

有个叫“猪头帮”的国家,采用一种简单的文法加密,他们所用的语言里面只有大写字母,没有其他任何字符;现在还知道他们加密的方法是:只用一个大写字母和原文进行异或运算生成密文。请你帮忙解开。

输入:

有若干组,每组输入有2行,第一行整数N表示有N个密文,接着一行有N个整数分别表示N个密文。

输出:

输出仅有大写字母组成的原文。

样例输入:

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

样例输出:

SDKJABCDEFGHIJKLMNOPQRSTUVWXYZ

2011-12-27 15:16:26

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1287

题意:这题的题意很让人莫名。其实是说存在一个大写字母x,然后让原文(都是大写字母)和x做xor后得到密文。现在给密文求原文。

因为x不知道,所以枚举x。判断方法是判断是否解密出来的原文都在’A'-’Z'范围内。

代码:

# include <stdio.h>


int num[10010] ;
int n ;

int test (int x)
{
    int i ;
    for (i = 0 ; i < n ; i++)
        if ((num[i]^x) < 65 || (num[i]^x) >= (65+26)) return 0 ;
    return 1 ;
}


int main ()
{
    int i, j ;
    while (~scanf ("%d", &n))
    {
        for (i = 0 ; i < n ;i++)
            scanf ("%d", num+i) ;
        for (i = 65 ; i < 65+26 ; i++)
            if (test(i)) break ;
        for (j = 0 ; j < n ; j++)
            putchar (num[j] ^ i) ;
        printf ("\n") ;
    }
    return 0 ;
}