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。
此题采用打表的方法,把所有可能用一个二维表保存。
而二维表有多大?
二维表的范围是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(); } } }
相关文章推荐
- HDOJ 1287 破译密码(异或运算)
- hdoj1287_破译密码
- HDOJ 题目1287 破译密码(暴力)
- HDOJ 1287:破译密码
- HDOJ-1287 破译密码(数学)
- hdoj 1287 破译密码
- HDOJ 1287 破译密码
- HDOJ 1287 破译密码(异或运算)
- HDU 1287 破译密码 异或运算
- hdu 1287 破译密码 水题
- Hdu 1287 破译密码
- hdu 1287破译密码(水)
- 杭电 1287 破译密码
- 杭电-1287 破译密码 (异或运算)
- HDU 1287 破译密码
- hdu 1287 破译密码
- HDU 1287 破译密码
- hdu 1287 破译密码
- hdu-1287- 破译密码
- 杭电 1287 破译密码