题目描述
古罗马帝国有一个强大的政府系统,有各种部门,包括保密部门。为了防止窃听,各省和首都之间的重要文件都是以加密的形式发送的。当时最流行的密码是所谓的替换密码和换位密码。
替换密码是将每个字母的所有出现都改为其他字母。所有字母的替代字母必须是不同的。对于某些字母,替代字母可能与原始字母重合。例如,应用替换密码将所有字母从A'到
Y’改变为字母表中的下一个字母,并将Z'改变为
A’,得到的信息是”/WJDUPSJPVT”。 例如,将排列组合⟨2;1;5;4;3;7;6;10;9;8⟩应用于信息”/VICTORIOUS”,就会得到信息”/IVOTCIRSUO”。
人们很快就发现,单独应用时,替换密码和换元密码都比较弱。但是当它们结合起来的时候,在那个时代已经足够强大了。因此,最重要的信息先用替换密码进行加密,然后用换元密码对结果进行加密。用上述密码的组合对信息 “ICTORIOUS “进行加密,可以得到信息 “JWPUDJSTVP”。
考古学家最近发现了刻在石板上的信息。乍一看,它似乎完全没有意义,所以有人认为这条信息是用一些替换和换元密码加密的。他们已经猜测出被加密的原始信息的可能文本,现在他们想检查他们的猜测。他们需要一个计算机程序来完成,所以你必须写一个程序。
思路
只需要看所有字母出现的次数相等即可。
例如:
YYDDSS
IIOOUU
每个出现的次数分别为
2 2 2
2 2 2
所以可以把 Y 映射成 T/ O / U ,其他字母都一样 。
代码
#include <bits/stdc++.h>
using namespace std ;
int main ( ) {
string s , t ;
while ( cin >> s >> t ) {
int a[26] = { 0 } , b[26] = { 0 } ;
int n = s.length ( ) ;
for ( int i = 0 ; i < n ; i ++ ) {
a[s[i] - 'A'] ++ ;
b[t[i] - 'A'] ++ ;
}
for ( int i = 0 ; i < 26 ; i ++ )
for ( int j = 0 ; j < 26 ; j ++ ) {
if ( a[i] == b[j] && a[i] > 0 && b[j] > 0 ) {
b[j] = 0 ;
break ;
}
}
int f = 0 ;
for ( int i = 0 ; i < 26 ; i ++ )
if ( b[i] > 0 ) {
cout << "NO" << endl ;
f = 1 ;
break ;
}
if ( f ) continue ;
else cout << "YES" << endl ;
}
return 0 ;
}