洛谷CF499B Lecture + 映射map

题目描述

你现在有一位新图论教授,你觉得他讲课讲的很好,但他说话实在是太快了,搞得你根本没有时间记笔记。所以呢,你有一个计划来跟上他讲课时的“脚步”,并记下重要的笔记。

你总共会两种语言:A 语言和 B 语言,教授用来讲课的是其中的 A 语言。A 语言和 B 语言有以下共同点:

  • 它们都由若干小写字母构成;
  • 每个单词里都不包括空格;
  • 它们的长度都不超过 10。

另外,可以保证同一种语言中任意两个单词都有不同的拼写,且 A 语言的每一个单词与 B 语言中的每一个单词一一对应。

你的做笔记方式如下:

  • 你必须写出写出教授给出的每一个单词;
  • 为保证写单词用时最短,你必须要选择两种语言中单词长度更短的一个;
  • 如果两个单词的长度一样,为保证讲课的原汁原味,你会选择第一种语言来做笔记。

我们会给你教授的演讲。而你呢,需要编一个程序来写出你的笔记。

输入格式

第一行包括两个整数,分别为教授的演讲里有多少个单词的 n,还有两种语言中共有多少词汇的 m(1≤n≤3000,1≤m≤3000)

接下来有 m 行,每行两个单词,分别为 ai​ 和 bi​(两种语言里的单词)

最后一样中有 n 个单词,代表教授的演讲。

输出格式

输出 n 个单词,代表按照题目中的规则你记下的笔记。

输入输出样例

输入 #1

4 3
codeforces codesecrof
contest round
letter message
codeforces contest letter contest

输出 #1

codeforces round letter round

输入 #2

5 3
joll wuqrd
euzf un
hbnyiyc rsoqqveh
hbnyiyc joll joll euzf joll

输出 #2

hbnyiyc joll joll un joll

此题可以用map映射

map是STL中的一个容器,使用时要先加上

#include <map>

map一般是这样定义的

map<int, int> m;

我们可以把map想象成一个一维数组,只是下标的类型和值由你来定义、赋值的,同样的,下标对应的值也是由你来定义、赋值;如下图

map<    int     ,    int    > m;
     下标的类型    数值的类型

赋值操作一般是这样的(只要m和k的类型与定义中相符即可)

m[k] = s;

下面来看此题的解题思路:

先用map做一个表,表里存储了输入数据(输入中的2~m + 1行每行的两个字符串一一对应前一个当下标,后一个当对应值

最后查表输出即可

#include <iostream>
#include <map>
#include <set>
#include <string>
using namespace std;
map<string, string> m;
int N, M;
int main(){
	string s1, s2;
	cin >> N >> M;
	for(int i = 1; i <= M; i++){
		cin >> s1 >> s2;
		m[s1] = s2;
	}
	for(int i = 1; i <= N; i++){
		string k;
		cin >> k;
		if(k.length() <= m[k].length()){
			cout << k << " ";
		} else {
			cout << m[k] << " ";
		}
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值