N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
如果是:
- N<=16,要求K<=16*N.
- N<=16,要求K<=10*N.
- N<=64,要求K<=15*N.
#include <iostream>
using namespace std;
void printArray(int* arr, int len) {
if (!arr) {
return;
}
for (int i = 0; i < len; ++i) {
cout << arr[i] << " ";
}
cout << endl;
}
int cmp(const void *a, const void *b) {
int aa = (*(const int*) a) >> 4;
int bb = (*(const int*) b) >> 4;
return aa - bb;
}
int cmp1(const void *a, const void *b) {
int aa = (*(const int*) a) >> 2;
int bb = (*(const int*) b) >> 2;
return aa - bb;
}
void disorder(int* arr, int len) {
srand((int) time(NULL));
for (int i = 0; i < len; i++) {
int tmp = rand() % len;
swap(arr[i], arr[tmp]);
}
}
int* encrypt1(int* arr, int len, int k) {
int id = 0;
int* encryptArr = new int[k * len];
memset(encryptArr, 0, sizeof(int) * k * len);
for (int i = 0; i < len; ++i) {
int index = (i << 4);
int prev = arr[i] >> 4;
int last = arr[i] & 15;
for (int j = 0; j < k - 8; ++j, id++) {
encryptArr[id] = index | prev;
}
for (int j = 0; j < 8; ++j, id++) {
encryptArr[id] = index | last;
}
}
// printArray(encryptArr, k * len);
disorder(encryptArr, k * len);
return encryptArr;
}
int* encrypt2(int* arr, int len, int k) {
int id = 0;
int* encryptArr = new int[k * len];
memset(encryptArr, 0, sizeof(int) * k * len);
for (int i = 0; i < len; ++i) {
int index = (i << 2);
int data1 = arr[i] >> 6;
int data2 = (arr[i] >> 4) & 3;
int data3 = (arr[i] >> 2) & 3;
int data4 = arr[i] & 3;
encryptArr[id++] = index | data1;
for (int j = 0; j < 2; ++j, id++) {
encryptArr[id] = index | data2;
}
for (int j = 0; j < 4; ++j, id++) {
encryptArr[id] = index | data3;
}
for (int j = 0; j < 8; ++j, id++) {
encryptArr[id] = index | data4;
}
}
// printArray(encryptArr, k * len);
disorder(encryptArr, k * len);
return encryptArr;
}
int* decrypt1(int* encryptArr, int len, int k) {
qsort(encryptArr, k * len, sizeof(int), cmp);
// printArray(encryptArr, k * len);
int* decryptArr = new int[len];
memset(decryptArr, 0, sizeof(int) * len);
int prev = 0;
int last = 0;
int count1 = 0;
int count2 = 0;
int index = 0;
for (int i = 0; i < k * len; i += k) {
prev = encryptArr[i];
count1 = 1;
count2 = 0;
for (int j = i + 1; j < i + k; ++j) {
if (prev == encryptArr[j]) {
count1++;
} else {
last = encryptArr[j];
count2++;
}
}
if (count1 > k - 8) {
if (count1 == k) { //加密前prev,last相同
last = prev;
}
swap(last, prev);
} else if (count2 > k - 8) {
if (count2 == k) {
prev = last;
}
}
prev &= 15;
last &= 15;
prev <<= 4;
decryptArr[index++] = prev | last;
}
return decryptArr;
}
int* decrypt2(int* encryptArr, int len, int k) {
qsort(encryptArr, k * len, sizeof(int), cmp1);
// printArray(encryptArr, k * len);
int* decryptArr = new int[len];
memset(decryptArr, 0, sizeof(int) * len);
int* data = new int[4];
int* count = new int[4];
int index = 0;
int id = 1;
for (int i = 0; i < k * len; i += k) {
memset(data, -1, 4 * sizeof(int));
memset(count, 0, 4 * sizeof(int));
data[0] = encryptArr[i];
count[0] = 1;
id = 1;
for (int j = i + 1; j < i + k; ++j) {
if (encryptArr[j] == data[0]) {
count[0]++;
} else if (encryptArr[j] == data[1]) {
count[1]++;
} else if (encryptArr[j] == data[2]) {
count[2]++;
} else if (encryptArr[j] == data[3]) {
count[3]++;
} else if (id < 4) {
data[id] = encryptArr[j];
count[id]++;
id++;
}
}
int data1 = -1;
int data2 = -1;
int data3 = -1;
int data4 = -1;
for (int i = 0; i < 4; ++i) {
if (!count[i]) {
break;
}
switch (count[i]) {
case 1:
data1 = data[i] & 3;
break;
case 2:
data2 = data[i] & 3;
break;
case 4:
data3 = data[i] & 3;
break;
case 8:
data4 = data[i] & 3;
break;
case 3:
data1 = data2 = data[i] & 3;
break;
case 5:
data1 = data3 = data[i] & 3;
break;
case 9:
data1 = data4 = data[i] & 3;
break;
case 6:
data2 = data3 = data[i] & 3;
break;
case 10:
data2 = data4 = data[i] & 3;
break;
case 12:
data3 = data4 = data[i] & 3;
break;
case 7:
data1 = data2 = data3 = data[i] & 3;
break;
case 11:
data1 = data2 = data4 = data[i] & 3;
break;
case 13:
data1 = data3 = data4 = data[i] & 3;
break;
case 14:
data2 = data3 = data4 = data[i] & 3;
break;
}
}
decryptArr[index] |= data1 << 6;
decryptArr[index] |= data2 << 4;
decryptArr[index] |= data3 << 2;
decryptArr[index] |= data4;
index++;
}
return decryptArr;
}
int* encryptChoice(int* arr, int len, int n, int k) {
int* encryptArr = NULL;
if (n == 16) {
if (len > n) {
return NULL;
}
if (k == 16) {
k = 12;
encryptArr = encrypt1(arr, len, k);
} else if (k == 10) {
encryptArr = encrypt1(arr, len, k);
}
} else if (n == 64 && k == 15) {
encryptArr = encrypt2(arr, len, k);
}
if (encryptArr) {
cout << "n,k: " << n << "," << k << endl;
cout << "加密数组:" << endl;
printArray(encryptArr, k * len);
}
return encryptArr;
}
void decryptChoice(int* encryptArr, int len, int n, int k) {
int* decryptArr = NULL;
if (n == 16) {
//int 是32bit
if (len > n) {
return;
}
if (k == 16) {
k = 12;
decryptArr = decrypt1(encryptArr, len, k);
} else if (k == 10) {
decryptArr = decrypt1(encryptArr, len, k);
}
} else if (n == 64 && k == 15) {
decryptArr = decrypt2(encryptArr, len, k);
}
if (decryptArr) {
cout << "解密数组:" << endl;
printArray(decryptArr, len);
}
}
int main() {
int arr1[] =
{ 12, 20, 51, 4, 7, 48, 32, 13, 41, 35, 44, 67, 55, 34, 54, 63 };
int len = sizeof(arr1) / sizeof(int);
int k = 16;
int n = 16;
int* encryptArr = NULL;
encryptArr = encryptChoice(arr1, len, n, k);
decryptChoice(encryptArr, len, n, k);
k = 10;
encryptArr = encryptChoice(arr1, len, n, k);
decryptChoice(encryptArr, len, n, k);
k = 15;
n = 64;
encryptArr = encryptChoice(arr1, len, n, k);
decryptChoice(encryptArr, len, n, k);
return 0;
}
N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.的更多相关文章
- memory barrier 内存屏障 编译器导致的乱序
小结: 1. 很多时候,编译器和 CPU 引起内存乱序访问不会带来什么问题,但一些特殊情况下,程序逻辑的正确性依赖于内存访问顺序,这时候内存乱序访问会带来逻辑上的错误, 2. https://gith ...
- Grafana Mimir:支持乱序的指标采集
Grafana Mimir:支持乱序的指标采集 译自:New in Grafana Mimir: Introducing out-of-order sample ingestion 很早之前在使用th ...
- Lintcode--003(乱序字符串)
给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 注意事项 所有的字符串都只包含小写字母 样例 ...
- tf.train.batch的偶尔乱序问题
tf.train.batch的偶尔乱序问题 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.train.batch的偶尔乱序问题 我们在通过tf.Reader读取文件后,都需要用batc ...
- 网络损伤仪WANsim中的乱序功能
乱序 乱序功能需要指定每个帧 发生乱序的概率,以及新的帧的位置相较于原来位置的时间范围. 乱序的概率范围是0%~20%,颗粒度是0.001%.Delay的设置范围为 0s~10s,颗粒度为0.1 ms ...
- [补题]找到原序列长度k的子序列中字典序最小的那个(单调栈)
题意 题目如题,输入序列只包含小写字母,数据范围0<k<=len<=500000. 例: 输入:helloworld 输出:ellld 题解 使用单调栈.当已删掉n-k个字符,输出栈 ...
- [转载]排序:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap
长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序. google笔试小题.题目来源:http://wenku.baidu.com/view/5aa818dda5 ...
- 在一个文件中有10G个整数,乱序排列,要求找出中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- 腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
腾讯面试题:10G 个整数,乱序排列,要求找出中位数.内存限制为 2G. 题目和基本思路都来源网上,本人加以整理. 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只 ...
随机推荐
- JavaScript数据结构与算法(五) 数组基础算法
- 0417 jQuery基础知识
jQuery基础知识 jQuery需要引入一个js文件,并且这个文件在所有js代码之前(包括引入的其他js文件) 基础操作(对比js): 1.找标签: js:document.getElement.. ...
- 获取 Let's Encrypt 免费通配符证书实现Https
说明 3月14日,Let's Encrypt的执行董事Josh Aas对外宣布,他们的通配符证书正式上线,用户可以基于此特性轻松部署/开启所有子域名的HTTPS功能. Let's Encrypt 是国 ...
- ubuntu14.4 分辨率偏低
最近出了 14.04 LTS,就想安装上玩一玩.还是用 easybcd 从 windows硬盘安装.装完之后,显示效果不好于是做了如下处理: 1. 按下windows键,搜索 "附加驱动&q ...
- Python super使用
一 基础使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如: #!/usr ...
- sdut 2878 圆圈
[ 题目描述]现在有一个圆圈, 顺时针标号分别从 0 到 n-1, 每次等概率顺时针走一步或者逆时针走一步,即如果你在 i 号点,你有 1/2 概率走到((i-1)mod n)号点,1/2 概率走到( ...
- TopCoder SRM 561 Div 1 - Problem 1000 Orienteering
传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一 ...
- ●BZOJ 1797 [Ahoi2009]Mincut 最小割
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1797 题解: 详细的讲解去看http://hzwer.com/3217.html首先跑一个最 ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 安装yum源和gcc编译器遇到的问题
这两天我试着在VMware虚拟机里安装gcc,遇到了不少问题 1. 安装yum源 我搭建的是光盘yum源(有两种方法搭建yum源,另外一种是网络yum源,但至今没弄懂我的网络yum源为什么不成功) ...