首页 > 代码库 > uva 1339 Ancient Cipher
uva 1339 Ancient Cipher
大意:
读入两个字符串(都是大写字母),字符串中字母的顺序可以随便排列。
现在希望有一种字母到字母的一一映射,从而使得一个字符串可以转换成另一个字符串(字母可以随便排列)
有,输出YES;否,输出NO;
exp:
输入
HAHA
HEHE
输出
YES
可以将A→E,或E→A;
关键在于,问题简化:
因为不用考虑字母位置,所以可以分别统计两个字符串中不同字母出现次数,计入数组counts1和counts2。
那么,怎么知道谁和谁对应呢?
这里面有个隐含条件:如果A→B,那么A在1数组出现的次数和B在2数组中出现的次数一定是一样的!
或者说,如果A出现的频率是30%,那么B也是30%。
即二者的地位是相同的。
所以,通过sort将counts1和counts2排序,并相互比较;如果二者一模一样,那就可以直接在对应字母间建立映射关系;否则,一定没法对应。
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int maxl=105;const int maxalpa=30;char sup[maxl];char sub[maxl];int counts1[maxalpa],counts2[maxalpa];int l;int main(){ while(scanf("%s%s",sup,sub)!=EOF) { memset(counts1,0,sizeof(counts1)); memset(counts2,0,sizeof(counts2)); l=strlen(sup); for(int i=0;i<l;i++) { counts1[sup[i]-‘A‘]++; counts2[sub[i]-‘A‘]++; } sort(counts1,counts1+26); sort(counts2,counts2+26); if(!memcmp(counts1,counts2,sizeof(counts1))) printf("YES\n"); else printf("NO\n"); memset(sup,0,sizeof(sup)); memset(sub,0,sizeof(sub)); } return 0;}
uva 1339 Ancient Cipher
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。