UVA1339仿射和换位密码
2014-01-18 17:08
260 查看
UVA1339 |
【题目描述】:密码 古典密码学有两种密码,仿射和换位,给定一段明文,一段密文,看密文能否由这段明文,是否可能通过仿射和换位得到。 【算法分析】:这道题目的关键是读题。因为接触过密码学,所以容易理解。 仿射密码:M=(m+a)%26,注意:对于相同的字母,仿射到同一个字母 换位密码:就是把所有的字母重排。 所以这道提的关键是,无论怎么仿射和置换,不用的字母总数不会增加,相同的字母的个数不会增加。即使通过很多次这样的操作也是这样。所以统计两段密文,不同的字母出现的个数,排序后比较即可。题外话:可能变换成功。 |
//密码学:仿射密码和置换密码 //难点:读题和归纳 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> #include<math.h> #include<queue> #include<vector> #include<map> #define MAXN 10+5 #define MAXM 20000+5 #define oo 9556531 #define eps 0.000001 #define PI acos(-1.0)//这个精确度高一些 #define REP1(i,n) for(int i=0;i<=(n);i++) #define REP2(i,n) for(int i=1;i<=(n);i++) using namespace std; char s1[1005],s2[1005]; int ap1[30],ap2[30]; bool isok() { memset(ap1,0,sizeof(ap1)); memset(ap2,0,sizeof(ap2)); for(int i=0; s1[i]!='\0'; i++) { ap1[s1[i]-'A'+1]++; ap2[s2[i]-'A'+1]++; } sort(ap1,ap1+27); sort(ap2,ap2+27); for(int i=0; i<27;i++) { if (ap1[i]!=ap2[i]) return false; } return true; } int main() { while(cin>>s1>>s2) { if (isok()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; } |
【关键词】:密码学(一般出题不难) |
相关文章推荐
- ubuntu下安装与卸载软件方法-转载
- linux故障,无法启动的解决方法
- vector的erase函数
- UVA 10382喷水设施
- 赫夫曼编码
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- Fifa Ultimate Team Millionaire Trading Center - Launching Now!
- Yii Framework 开发教程(14) UI 组件 MaskedTextField示例
- sdut2164Binomial Coeffcients(组合数求模)
- Mac和Windows中常见中文字体的英文名称
- Cordova 3.3 开发环境搭建(视频)
- java学习笔记(一)
- XML
- Yii Framework 开发教程(13) UI 组件 ContentDecorator示例
- Yii Framework 开发教程(12) UI 组件 ClipWidget示例
- 百度开源编辑器内容获取与更改
- Linux命令详解之find
- Yii Framework 开发教程(11) UI 组件 ActiveForm示例
- LA2965字符串合并
- js取float型小数点后两位数的方法