题目链接:
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; }
原文:http://blog.csdn.net/lianai911/article/details/44679903