POJ 2015 JAVA
2015-11-11 18:11
239 查看
http://poj.org/problem?id=2015
题目太长了,意思简单地描述一下
就是说给出密钥:码串 S 和变换码串P还有一个整数x,可以根据明文 M(长度为 n),求出暗文C。
首先,S的长度是2的正整数次幂的字母集合
顾名思义,P就是S中所有字母的另一种排列方式,而M和C的长度相同,且字符都来源于S。
加密方式:
1. d =( n^1.5 + x )% n
2. 若 M[ d ]=P[ R ],则 C[ d ] =S[ R ]
3. 对于C中其他位置的字符,设所在位置为 j ( j = 0..n-1,j≠d ),设 M[j] 在 P 中的位置为 r1,M[(j+1) % n] 在 S 中的位置为 r2
则 C[ j ] = S[ r1^r2 ]
最后需要一个解密代码
输入方式
x
S
P
C
...
结束输入为x=0
思路为从d开始往前递推,原来想用dp的,因为没考虑到d的作用。
一次AC,下面是代码
import java.util.Scanner;
public class Permutation_Code {
static int x,d,n,l;
static char[] s,p,c,m;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String S,P,C,M;
while(0!=(x=Integer.parseInt(sc.nextLine()))){
S=sc.nextLine();
P=sc.nextLine();
C=sc.nextLine();
l=S.length();
n=C.length();
m=new char
;
s=S.toCharArray();
p=P.toCharArray();
c=C.toCharArray();
d=((int)(Math.pow(n, 1.5)+x))%n;
m[d]=p[R(s,c[d])];
int count=1,j=d;
while(count<n){
int J=(j--+n)%n;
int Jm=(J-1+n)%n;
int r2=R(s,m[J]);
int r=R(s,c[Jm]);
m[Jm]=p[r^r2];
count++;
}
System.out.println(m);
}
}
private static int R(char[] r,char c){
for(int i=0;i<r.length;i++){
if(r[i]==c)
return i;
}
return -1;
}
}
题目太长了,意思简单地描述一下
就是说给出密钥:码串 S 和变换码串P还有一个整数x,可以根据明文 M(长度为 n),求出暗文C。
首先,S的长度是2的正整数次幂的字母集合
顾名思义,P就是S中所有字母的另一种排列方式,而M和C的长度相同,且字符都来源于S。
加密方式:
1. d =( n^1.5 + x )% n
2. 若 M[ d ]=P[ R ],则 C[ d ] =S[ R ]
3. 对于C中其他位置的字符,设所在位置为 j ( j = 0..n-1,j≠d ),设 M[j] 在 P 中的位置为 r1,M[(j+1) % n] 在 S 中的位置为 r2
则 C[ j ] = S[ r1^r2 ]
最后需要一个解密代码
输入方式
x
S
P
C
...
结束输入为x=0
思路为从d开始往前递推,原来想用dp的,因为没考虑到d的作用。
一次AC,下面是代码
import java.util.Scanner;
public class Permutation_Code {
static int x,d,n,l;
static char[] s,p,c,m;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String S,P,C,M;
while(0!=(x=Integer.parseInt(sc.nextLine()))){
S=sc.nextLine();
P=sc.nextLine();
C=sc.nextLine();
l=S.length();
n=C.length();
m=new char
;
s=S.toCharArray();
p=P.toCharArray();
c=C.toCharArray();
d=((int)(Math.pow(n, 1.5)+x))%n;
m[d]=p[R(s,c[d])];
int count=1,j=d;
while(count<n){
int J=(j--+n)%n;
int Jm=(J-1+n)%n;
int r2=R(s,m[J]);
int r=R(s,c[Jm]);
m[Jm]=p[r^r2];
count++;
}
System.out.println(m);
}
}
private static int R(char[] r,char c){
for(int i=0;i<r.length;i++){
if(r[i]==c)
return i;
}
return -1;
}
}
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例