当前位置: 代码迷 >> 综合 >> HDOJ 1287 破译密码
  详细解决方案

HDOJ 1287 破译密码

热度:23   发布时间:2023-10-21 19:56:54.0

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[n];for (int i = 0; i < a.length; i++) {a[i] = sc.nextInt();}int b[] = new int[n];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();}    }
}