算法竞赛入门经典(第二版) | 例题4-1 古老的密码 (UVa1339,Ancient Cipher)

疫情当前,本着“戴口罩总比戴呼吸机好,躺家里总比躺ICU强”的正确理念,让我们动起快乐的小手,一起宅在家里敲代码叭!


提目(提交)链接→UVa-1339
百度翻译→百度翻译
没使用过该网站的同学请猛戳这里→vJudge教程

分析:

这道题对于我这种数学渣渣来说简直是直击心灵的暴击,最开始理解“映射”:只能以同一规律映射,比如串A正确排序后,所有元素前移/后移n个单位得到串b,但其实它指的是一一映射
举个栗子:串A:HHAA。串B:HHEE, H映射H,A映射E或者H映射E,A映射H,都是OK的。
因此本题可以转化为:a串中字母数量为1,2,3…的个数是否等于串b中字母数量为1,2,3…的个数
如:ABBBCCC 与 EJJJZZZ是映射的。

所以这道题可以用查表的方式来做:a[26] 存放a串 , b[26]存放b串, 用algorithm中的count判断每个字母出现的次数。最后统计是否相等

代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#define Max 105
using namespace std;
int main()
{
	char a[105], b[105];
	int a1[105], b1[105]; 
	while(cin>>a>>b) {
		memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1));
		int len1 = strlen(a), len2 = strlen(b);		//长度 
		for(int i = 'A'; i <= 'Z'; i++) {
			int num = count(a,a+len1,(char)i);
			(num==0) ? : a1[num]++;
			num = count(b,b+len2,(char)i);
			(num==0) ? : b1[num]++;
		}
		cout << ((memcmp(a1,b1,sizeof(a1))) ? "NO" : "YES") << endl;
	}
}
总结:

1、我们要摸透出题人的心思,试想:如果我们是出题人,出了一道大水题,会让它又臭又长或是用复杂的函数吗? 不会。所以做这种题千万千万不要想得太复杂。 想清楚这个问题,你会发现很多题变得如此简单
2、比较流行的另一种解法是用Vector容器,大致思路是:设a[26],b[26],分别代表26个字母出现的次数,然后排序,比较v1==v2,看个人偏好去使用了。
3、大家可以思考一下,19行的代码如果不用判断相等函数三元运算符,可以拆出几行代码。


最后,分享一条大牛的建议(对笔者受益匪浅):平时在做题的时候,一定要寻找最优解,而不是 ac 了就不管了,应该多看看别人的解法。

发布了73 篇原创文章 · 获赞 61 · 访问量 4791

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104338228
今日推荐