POJ 2159 : Ancient Cipher - 密码模拟

题意:
含义是指:将任意字母替换为任意一个字母,只要不出现多个字母替换成同一个就可以,即为一一映射。
因此,我们只需要判断两个字符含有的不同的字母数量以及对应出现的次数都相同就行了。

分析:

“移位”只是置换密码的一种,只要满足“Substitutes for all letters must be different.”就是置换了,比如

A->B

C->H

Z->D

对于这道题,input:

AAABB
CCCEE

应输出

YES

所以明文与密文的“字母频率的数组”应该是一样的,即明文中某字母出现8次,密文中也必须有某个字母出现8次。

所以字母种类,字母频率同时相等时,即被破解。

permutation cipher(排列密码):

Permutation cipher applies some permutation to the letters of the message. For example, applying the permutation <2, 1, 5, 4, 3, 7, 6, 10, 9, 8> to the message "VICTORIOUS" one gets the message "IVOTCIRSUO".

明文随机排列,所以字母种类和频率都不变。

对于这道题,排列密码考虑和不考虑对解题无影响!”

另:

2159Accepted696K47MSG++550B

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
	char en[105],ans[105];
	int a[30],b[30],i;

	while(~scanf("%s",en)){
		scanf("%s",ans);
		int l=strlen(en);

		memset(a,0,sizeof(a));
		for(i=0;i<l;i++)
			a[ans[i]-'A']++;
		memset(b,0,sizeof(b));
		for(i=0;i<l;i++)
			b[en[i]-'A']++;
		sort(a,a+30);
		sort(b,b+30);
		for(i=0;i<30;i++)
			if(a[i]!=b[i])
				break;

		if(i<30)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值