您的位置:首页 > 其它

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;

}


【关键词】:密码学(一般出题不难)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: