您的位置:首页 > 其它

HDOJ 1287 破译密码

2017-10-27 21:24 246 查看
HDACM1287

此题采用打表的方法,把所有可能用一个二维表保存。

而二维表有多大?

二维表的范围是32*27,为什么这么说?因为A~Z的二进制值:

0100 0001~0101 1011 ,一个字母^另一个字母的值的范围:

0~31(异或:相同为0,不同为1,所以范围在0~2^5)

密文=(一个字母)^(原文)

由:a^b^a = b。可知:原文=密文^(一个字母)=(一个字母)^(原文)^(一个字母)

所以可知二维表的范围为32*27。

import java.util.Scanner;

public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m[][] = new int [32][27];
for (int i = 0; i < m.length; i++) {
for (int j = 1; j < m[i].length; j++) {
m[i][j] = i^(j+64);//当j==1 时 j+64==A
}
}
while (sc.hasNext()) {
int n = sc.nextInt();
int a[] = new int
;
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
int b[] = new int
;
boolean boo = true;
for (int i = 1; i < 27; i++) {
for (int j = 0; j < n; j++) {
if (m[a[j]][i]<65||m[a[j]][i]>91 ) {
boo=false;
break;
}
boo=true;
b[j]=m[a[j]][i];
}
if (boo) {
break;
}
}
for (int i = 0; i < b.length; i++) {
System.out.print((char)b[i]);
}
System.out.println();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: