POJ_2159

题目见:http://poj.org/problem?id=2159


可以说题目本身有一定的迷惑性,一串明文经过凯撒加密和乱序加密得到一串密文,现在要求判断密文和猜测的明文是否一致。

乍看到这个题目,首先想到的是按步骤反过来解密,然后和明文对比是否相同就行。可是发现对于乱序加密来说,乱序码是不知道的!它是随机的,而且题目只给出了10以内的乱序码,而输入可以不大于100!显然,这种反过来解密的方法是不可取的了。


想了一会儿,实在是不知道该如何下手,忍不住看了下题目下放讨论,大家都在说什么“频率”,“频率分布一样,就YES”。然后又自习读了遍题目。原来真是这样!


判断密文和猜测明文是否一致,只要把频数出现相同的字母归结为一类,再将频数排序后,比较频数是否相同就可以拉!(唉~ 真是替自己拙计。。)只要相同就输出YES就好了,至于它到底是通过什么乱序吗加密的,就不需要我们来考虑了,毕竟我们也是猜的嘛!(例如:密文中有nihao,且其中的每个字母出现了一次,把他们归为一类。明文中有buyao,每个字母也仅出现一次,这样我们就认为这两类是等价的!)


下面给出程序的C++代码:


#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
	int i;
	string input;
	int mm[26],mw[26];

	memset(mm,0,sizeof(mm));       
	memset(mw,0,sizeof(mw));
	
	cin>>input;
	for(i=0;i<input.length();i++)
	{
		mm[input[i]-'A']++;
	}
	cin>>input;
	for(i=0;i<input.length();i++)
	{
		mw[input[i]-'A']++;
	}
	sort(mm,mm+26);        
    sort(mw,mw+26);  

	for(i=0;i<26;i++)
		if(mm[i]!=mw[i])
		{
			cout<<"NO"<<endl;
			return 0;
		}
	cout<<"YES"<<endl;
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值