題意:
破譯密碼
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("\n");
}
return 0;
}