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.只 ...
随机推荐
- [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
Given a binary search tree with non-negative values, find the minimum absolute difference between va ...
- postman学习笔记(一)——最简单的postman入门
昨天开始正式接触postman的操作,最简单的操作是根据接口文档一个个测试接口. 例如: 测试环境地址:http://111.2.198.4(项目组自己的测试环境,要测试的项目组肯定会给你的) //以 ...
- 使用IntelliJ IDEA的小技巧快乐编程(1)
前言 我很喜欢和别人讨论一些问题,有时候,在公司里,讨论这样的问题需要演示代码.常常会碰到的一种情况是(根据我的记忆这半年多来至少超过了10次),别人会打断你的演示,抛出一个问题:等等,你刚才的操作是 ...
- 医疗器械c#上位机开发指引教程
此教程面向的读者:对医疗器械上位机编程有兴趣,或者急需了解医疗器械(尿常规.血液分析.生化.心电.B超等医疗下位仪器)的编程流程.编程细节的程序员. 1.得到仪器协议 当我们需要与医疗器械等下位机数据 ...
- 机器学习技法:15 Matrix Factorization
Roadmap Linear Network Hypothesis Basic Matrix Factorization Stochastic Gradient Descent Summary of ...
- [JSOI 2011]分特产
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- [bzoj4161]Shlw loves matrix I
来自FallDream的博客,未经允许,请勿转载,谢谢. 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1 ...
- Django Class Views
一.Base views View class django.views.generic.base.View 主要的基于类的基本视图.所有其他基于类的视图都从这个基类继承而来.它不是一个通用的视图,因 ...
- python (3.5)字符串 持续更新中………………
# 字符串与变量连接输出 name = input("请输入姓名")age = input("请输入年龄")job = input("请输入工作&qu ...