POJ_2159

来源:互联网 发布:41478 网络电视直播 编辑:程序博客网 时间:2024/06/07 23:17

题目见: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;}


原创粉丝点击