【ETOJ 1052】气球数量 题解(映射+队列)

题目描述

空中有 n n n 个气球,第 i i i 个气球有一个颜色 c o l i col_i coli (用一个字符串表示)。

请你求出每种气球的个数,按照气球出现的顺序进行排序输出。

输入格式

第一行一个整数 T T T 表示样例个数。 ( 1 ≤ T ≤ 10 ) (1≤T≤10) (1T10)

对于每个样例,第一行一个整数 n n n 表示气球个数。 ( 1 ≤ n ≤ 100 ) (1≤n≤100) (1n100)

接下来 n n n 行,每行一个字符串表示 c o l i col_i coli ( 1 ≤ ∣ c o l i ∣ ≤ 50 ) (1≤∣col_i∣≤50) (1≤∣coli∣≤50)

字符串仅包含小写英文字母。

输出格式

对于每个样例,输出所有气球的种类和个数。

样例输入

2
3
red
red
blue
5
a
b
e
d
e

样例输出

red 2
blue 1
a 1
b 1
e 2
d 1

思路

使用哈希映射来快速查找和更新每个颜色的出现次数,使用队列来保持颜色的输入顺序。

首先从输入中读取测试用例的数量。对于每个测试用例,清空哈希映射,然后读取气球的数量。接下来,对每个气球进行处理,读取颜色,更新哈希映射中的计数。如果颜色是首次出现,将其添加到队列中。完成所有气球的处理后,按照颜色首次出现的顺序,从哈希映射中取出颜色及其出现的次数,打印出来。


AC代码

#include 
#include 
#include 
#include 
#define AUTHOR "HEX9CF"
using namespace std;

map<string, int> m1;
queue<string> q1;

int main() {
	int t;
	cin >> t;
	while (t--) {
		m1.clear();
		int n;
		cin >> n;
		while (n--) {
			string col;
			cin >> col;
			if (!m1.count(col)) {
				q1.push(col);
			}
			m1[col]++;
		}
		while (q1.size()) {
			string col = q1.front();
			cout << col << " " << m1[col] << endl;
			q1.pop();
		}
	}
	return 0;
}

你可能感兴趣的:(Algorithm,Problems,c++,算法)