HDOJ 1287 破译密码(异或运算)

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

异或的部分知识点:
参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。
按位异或的3个特点:
(1) 0^0=0,0^1=1 0异或任何数=任何数
(2) 1^0=1,1^1=0 1异或任何数-任何数取反
(3) 任何数异或自己=把自己置0
按位异或的几个常见用途:
(1) 使某些特定的位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
      10100001^00000110 = 10100111

(2) 实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
    a = a^b;   //a=10100111
    b = b^a;   //b=10100001
    a = a^b;   //a=00000110

(3) 在汇编语言中经常用于将变量置零:
xor a,a

(4) 快速判断两个值是否相等
举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
return ((a ^ b) == 0)

加密-解密:
class E
{ public static void main(String args[ ])
{
char a1=’十’ , a2=’点’ , a3=’进’ , a4=’攻’ ;
char secret=’8’ ;
a1=(char) (a1^secret);
a2=(char) (a2^secret);
a3=(char) (a3^secret);
a4=(char) (a4^secret);
System.out.println(“密文:”+a1+a2+a3+a4);
a1=(char) (a1^secret);
a2=(char) (a2^secret);
a3=(char) (a3^secret);
a4=(char) (a4^secret);
System.out.println(“原文:”+a1+a2+a3+a4);
}
}

char类型,也就是字符类型实际上就是整形,就是数字.
位运算就是二进制整数运算.
两个数按位异或意思就是从个位开始,一位一位的比.
如果两个数相应的位上一样,结果就是0,不一样就是1
所以111^101=010
那加密的过程就是逐个字符跟那个secret字符异或运算.
解密的过程就是密文再跟同一个字符异或运算
010^101=111

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int a[] = new int[n];
            for(int i=0;i<n;i++){
                a[i]=sc.nextInt();
            }
            boolean isFlag= true;
            char ch[] = new char[n];
            for(int i=65;i<=90;i++){
                for(int h=0;h<n;h++){
                    ch[h]='0';
                }
                isFlag= true;
                for(int j=0;j<n;j++){
                    ch[j] = (char) (i^a[j]);
                    if(ch[j]<65||ch[j]>90){
                        isFlag=false;
                        break;
                    }
                }
                if(isFlag){
                    for(int k=0;k<ch.length;k++){
                        System.out.print(ch[k]);
                    }
                    System.out.println();
                    break;
                }
            }
        }
    }
}
时间: 2024-10-01 07:15:47

HDOJ 1287 破译密码(异或运算)的相关文章

authcode函数使用异或运算进行加密和解密

康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献.包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密. 原理如下,假如: 加密 明文:1010 1001 密匙:1110 0011 密文:0100 1010 得出密文0100 1010,解密之需和密匙异或下就可以了 解密 密文:0100 1010 密匙:1110 0011 明文:1010 1001 并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙.

java-两个很长的16进制字符串怎么进行异或运算?

问题描述 两个很长的16进制字符串怎么进行异或运算? str1=""0d1fe39e573488cf"" str2=""0d1fe39e573488ee595acd5c6d4ce0f445476794"" 怎不进行异或运算? 由于太长不能转化成long 解决方案 每2个一组,存入数组,然后循环异或. 解决方案二: byte[] array1 = str1.getBte();byte[] array2 = str2.getByt

位运算-char类型的两个数经过异或运算之后数据类型怎么变成int类型了?

问题描述 char类型的两个数经过异或运算之后数据类型怎么变成int类型了? #include int main(void){ char a = 0xa2; char b = 0x32; char test = a ^ b; printf(""%#x"" test); return 0; } 我期望的打印结果是:0x90结果打印的是:0xffffff90 好像数据变成int类型了,这个是怎么回事? 解决方案 c int or wint_t When used wit

mfc-串口通信中 将接收编辑框的数据进行异或运算

问题描述 串口通信中 将接收编辑框的数据进行异或运算 目前呢思路是将编辑框的数据获取过来 赋予一个变量 将变量输出到另一编辑框 可是具体的过程怎么实现?异或运算符具体怎么实现这个?求大神指教 解决方案 将数据写入文本框 setdlgitemint 读取 getdlgitemint 异或 ^ 解决方案二: http://blog.csdn.net/zacklin/article/details/7454735 解决方案三: 那么异或可以对一组数据进行运算么?具体该怎么使用? 解决方案四: 那么异或

c语言-异或运算,搞不懂我随便写的,刚接触C语言

问题描述 异或运算,搞不懂我随便写的,刚接触C语言 #include #include unsigned char Encrypt(unsigned char cKey,unsigned char cCode) { unsigned char sKey; sKey=cKey^cCode; return(sKey); } unsigned char prog8_2() { unsigned char Encrypt(unsigned char cKey,unsigned char cCode);

FEC之异或运算应用

话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a xor a = 0 2). a xor 0 = a 3). (a xor b) xor c = a xor (b xor c)4). IF a xor b = c THEN a xor c = b    异或的运算特性有两点很好的应用 查找 case 1: 一个数组,除了其中一个元素,其他元素都为空

c异或运算 c异或运算符号_C 语言

与运算:&两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:|两者都为0为0,否则为11|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~1取0,0取1~1 = 0, ~0 = 1~(10001) = 01110 异或运算两者相等为0,不等为11^1=0, 1^0=1, 0^1=1, 0^0=0 下面是详细的解释: 位运算    位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是

位运算中的异或运算 .

位运算是非常迅速的,因为它直接对内存中的二进制数据进行操作.  按位运算除了,按位与,按位非,按位左移,按位右移,还有按位异或. 按位异或运算定义, 1 ^ 1=0 1 ^ 0=1 0 ^ 1=1 0 ^ 0=0 异或,就是"看看你们到底一样不一样.不一样就为1,一样就为0."   按位异或运算的规律是 定理一a ^ b = b ^ a 定理二 a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c; 定理三 a ^ b ^ a = b, a ^ a^ b = b,

按位与、或、异或等运算方法

按位与运算符(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;        即:两位同时为"1",结果才为"1",否则为0 例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1.   另,负数按补码形式参加按位与运算. "与运