CF499B Lecture 题解

Content

有一个教授用 \(\texttt{A}\) 语言讲课。你觉得他讲的太快了,所以决定使用 \(\texttt{A}\) 语言和 \(\texttt{B}\) 语言记笔记。

已知 \(\texttt{A}\) 语言和 \(\texttt{B}\) 语言中的 \(m\) 对单词的意思是互相对等的,因此,使用 \(\texttt{B}\) 语言可能会让你的笔记更加简洁。当然,如果 \(\texttt{A}\) 语言中的单词的长度和 \(\texttt{B}\) 语言中意思相等的单词的长度相等,甚至 \(\texttt{A}\) 语言中的单词长度还要短,那么你还是会首选用 \(\texttt{A}\) 语言记笔记。

现在给出教授的演讲(有 \(n\) 个单词),请你按照以上规则记好笔记。

数据范围:\(1\leqslant n,m\leqslant 3000\)

Solution

我们为什么不使用 \(\texttt{map}\) 来解决这道题目呢?

由于可以肯定教授只用 \(\texttt{A}\) 语言来演讲,因此我们直接将 \(\texttt{A}\) 语言中的意思相等的单词用 \(\texttt{map}\) 映射到 \(\texttt{B}\) 语言中去,然后在每个单词对比是否会使记笔记的长度减少即可。

Code

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

int n, m;
string a, b, sp[3007];
map<string, string> mm1;

int main() {
	scanf("%d%d", &n, &m);
	while(m--) {
		cin >> a >> b;
		mm1[a] = b;
	}
	for(int i = 1; i <= n; ++i) {
		cin >> sp[i];
		if(mm1[sp[i]].size() < sp[i].size())	sp[i] = mm1[sp[i]];
	}
	for(int i = 1; i <= n; ++i)	cout << sp[i] << ' ';
}
posted @ 2021-12-21 20:18  Eason_AC  阅读(38)  评论(0)    收藏  举报