题目描述
你现在有一位新图论教授,你觉得他讲课讲的很好,但他说话实在是太快了,搞得你根本没有时间记笔记。所以呢,你有一个计划来跟上他讲课时的“脚步”,并记下重要的笔记。
你总共会两种语言: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;
}