异或性质:
C=A XOR B--> C XOR B=A
枚举异或的字母,如果是合法的,那么所有解密出来的字母都在[A,Z]之间。
自己被优先级坑了一回
if((text[i]^key) <'A' || (text[i]^key)>'Z')
(text[i]^key)一开始没加括号......
基础啊,既然没有背过优先级,为了保险,不把握的地方就加上括号吧。
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN=1000;
int text[MAXN+5];
void work(int n)
{
int i,key,flag;
for(i = 0; i < n; i++)
scanf("%d",&text[i]);
for(key = 'A'; key <= 'Z'; key++)
{
flag = 1;
for(i = 0; i < n; i++)
if((text[i]^key) <'A' || (text[i]^key)>'Z')
{
flag = 0;
}
if(flag) break;
}
for(i = 0; i < n; i++)
printf("%c",text[i]^key);
printf("\n");
}
int main()
{
int n;
while(~scanf("%d",&n))
work(n);
return 0;
}