百度之星 2015资格赛 列变位法解密【字符串】
列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置任何字符,完成后按列读取即成密文。
比如:
原文:123456789
密钥:4
变换后的矩阵:
1234
5678
9xxx
(最后的几个x表示无任何字符,不是空格,不是制表符,就没有任何字符,下同)
密文:159263748
再比如:
原文:Hello, welcome to my dream world!
密钥:7
变换后的矩阵:
Hello,
welcome
to my
dream w
orld!xx
密文:
Hw doeetrrlloellc adoomm!,my e w
实现一个利用列变位法的加密器对Bob来说轻而易举,可是,对Bob来说,想清楚如何写一个相应的解密器似乎有点困难,你能帮帮他吗?
第一行一个整数TT,表示TT组数据。
每组数据包含22行
第一行,一个字符串s(1 \leq |s| \leq 1e5)s(1≤∣s∣≤1e5),表示经过列变位法加密后的密文
第二行,一个整数K(1 \leq K \leq |s|)K(1≤K≤∣s∣),表示原文在使用列变位法加密时的密钥
输入保证密文字符串中只含有ASCII码在[0x20,0x7F)[0x20,0x7F)范围内的字符
对于每组数据,先输出一行
Case #i:
然后输出一行,包含一个字符串s_decrypt,表示解密后得到的明文
4 159263748 4 Hw doeetrrlloellc adoomm!,my e w 7 Toodming is best 16 sokaisan 1
Case #1: 123456789 Case #2: Hello, welcome to my dream world! Case #3: Toodming is best Case #4: sokaisan
题意:
给出一种加密的方式,现在给出密文以及加密的密钥,让你破解出原始数据
题解:
见到题的第一反应就是先手动模拟把这个过程逆推一下,后来发现,根本不行啊,如果创建二维字符数组的话, 先不说效率,数组的大小都难以进行控制
比如说,字符串长度100万,如果K 是1 那么第一维需要开到100万,如果k 是100万,第二维需要开到100万.......
只能换方法(如果用string或者vector,应该也是可以的)
不难发现,主要的任务是,找到经过所给的方式加密后,原下标和当前下标的对应关系,只要对应关系找到了,直接进行输出就可以了.....
对一个字符串进行了题目所述的加密方式时,有可能有的列比较短,已知长度和K,不难求出较短行和较长行的个数,然后进行下标变换就行了,也就是对较短的和较长的列(加密之后就成了行),分别进行处理。
ps:
渣渣水平,调试了好一会,才过了样例,真心怀疑人生了...
不过AC的时候才明白:唉,又水了一道.....
/*
http://blog.csdn.net/liuke19950717
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1005;
char s[maxn*maxn];
int main()
{int t;//freopen("shuju.txt","r",stdin);scanf("%d",&t);for(int kase=1;kase<=t;++kase){getchar();printf("Case #%d:\n",kase);gets(s);int k;scanf("%d",&k);int len=strlen(s);int x=len/k,y=len%k;//行数和余数int base=x; //记录最小的行数if(y)//有不足的行 {++x;//最大的行数}int cnt=0;//总个数for(int i=0;i<x&&cnt<len;++i)//x行 {for(int j=0;j<k&&cnt<len;++j){int a=j,b=0;//初始值if(j>y)//如果到了有空缺的行{a=y;b=j-y;}printf("%c",s[a*x+b*base+i]);//这个地址变换还是很好想的....++cnt;}}printf("\n");}return 0;
}
百度之星 2015资格赛 列变位法解密【字符串】相关推荐
- 百度之星2015资格赛 列变位法解密
列变位法解密 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem De ...
- 百度之星1002——模拟——列变位法解密
Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置 ...
- 字符串处理 2015百度之星资格赛 1002 列变位法解密
题目传送门 1 /* 2 字符串处理:要求解码,然而二维数组开不下,可以直接输出 3 只要在余数的地方判断一下就行了,vector的效率不高 4 另外:感觉麻烦的地方应该纸上写写就清楚了 5 */ 6 ...
- 2015年百度之星程序设计大赛 - 资格赛:1002列变位法解密
列变位法解密 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem De ...
- 字符串处理 百度之星资格赛 1002 列变位法解密
题目传送门 1 /* 2 字符串处理:要求解码,然而二维数组开不下,可以直接输出 3 只要在余数的地方判断一下就行了,vector的效率不高 4 */ 5 #include <cstdio> ...
- 2015百度之星 列变位法解密
列变位法解密 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...
- 列变位法解密--百度之星B题
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=584&pid=1002 关于百度之星的晋级规则说明 列变位法 ...
- 列变位法解密-2016百度之星 - 测试赛(热身,陈题)
列变位法解密 Accepts: 296 Submissions: 904 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- 列变位法解密(2016百度之星 - 测试赛(热身,陈题))
列变位法解密 Accepts: 132 Submissions: 351 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
最新文章
- python同时同步发送多个请求_python如何实现“发送一个请求,等待多个响应”的同步?...
- 两台oracle怎样定期导表数据,定期从Oracle导数据至MySQL
- Win 2008 R2安装SQL Server 2008“性能计数器注册表配置单元一致性”失败的解决办法...
- 13. Roman to Integer
- 网站改title的后果到底有多惨?
- 轻松理解条件随机场(CRF)
- 汉字笔顺口诀_一帮40后理工男编出新型字典,《笔顺码字典》在汉首发
- 17秋 SDN课程 第五次上机作业
- [转]Angular: Hide Navbar Menu from Login page
- 项目实战中的防御性编程
- rmt_redis.c:6446 ERROR: Can't handle RDB format version redis-migrate-tool迁移工具报错
- 计算机二级1px等于多少厘米,px和pt换算(1px等于多少pt)
- ABB机器人紧凑型控制柜内部结构(图)
- android 刷recovery,安卓手机怎么刷入Recovery 命令行刷入Recovery教程
- 如何修改PDF文件,怎样将PDF文件拆分
- 基于安卓的高清语音技术亮相中国国际通信展览会
- 记一次 nginx的rewrite和proxy_pass操作
- 学历真的是衡量一个人的首要条件吗?
- Java代码实现点赞功能
- 【推文】人间清醒VS梅花痣俏郎君
热门文章
- 安装应用需要打开未知来源权限_OPPO手机未知来源权限在哪 OPPO手机未知来源权限设置方法...
- “2018活水计划”首次调研启动,国内外产学研实现共振
- 韩国 naver web网页版第三方登录 naver网页登录
- 股市非常态,CCI指标买卖点实例图解
- 东北大学5月校赛c题
- 圈粉年轻人的“机票盲盒”,爆款的逻辑是什么?
- MySQL 的数据备份与恢复
- 产业护航 湾区共振!11月30日飞桨携手生态伙伴带来企业智能化升级的新思路...
- vue2.0 渲染列表在苹果手机加载不出来的问题
- 扔鸡蛋问题(四种解法)