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