POJ2159 Ancient Cipher【字符密码】
原创
©著作权归作者所有:来自51CTO博客作者ITCharge的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接:
http://poj.org/problem?id=2159
题目大意:
古罗马帝王的保密服务部门的保密方法是替换和重新排列。
替换方法是将出现的字符替换成其他的字符。如将'A'替换成'Z',将'Z'替换成'A'。
排列方法是改变原来单词中字母的顺序。例如将顺序变为<2,1,5,4,3,7,6,10,9,8>。应用到字符串
"VICTORIOUS"上,则可以得到"IVOTCIRSUO"。
单用一种解密方法是不安全的,只有将两种方法结合起来才安全。那么问题来了:给你一个原文
字符串和加密字符串,问是否能通过这两种加密方法结合,从而由原文信息得到加密信息。如果
能则输出"YES",否则输出"NO"。
思路:
其实这道题没那么复杂,只要用两个数组分别存下两个字符串中各个字母的个数,排序一下,比较
字母个数是不是都相等就可以了,如果不是全相等,则说明不能从原文信息得到加密信息。如果全
相等,则一定有方法从原文信息得到加密信息。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[110],s2[110];
int a[28],b[28];
int main()
{
while(~scanf("%s%s",s1,s2))
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i < len1; ++i)
a[s1[i]-'A']++;
for(int i = 0; i < len2; ++i)
b[s2[i]-'A']++;
sort(a,a+26);
sort(b,b+26);
int flag = 1;
for(int i = 0; i < 26; ++i)
{
if(a[i] != b[i])
{
flag = 0;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}