T292219 [传智杯 #5 练习赛] 复读

169 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

[传智杯 #5 练习赛] 复读

题目描述

给定若干个字符串,不定数量,每行一个。有些字符串可能出现了多次。如果读入一个字符串后,发现这个字符串以前被读入过,则这个字符串被称为前面相同的字符串的复读,这个字符串被称为复读字符串。相应的,每个首次出现的字符串就是非复读字符串

举个例子,

abc
def
abc
abc
abc

1,3,4,51,3,4,5 行是字符串 abc,那么 3,4,53,4,5 行的字符串会被称为“复读”。

请你把所有的非复读字符串,按照行号从小到大的顺序,依次拼接为一个长串并输出。

输入格式

多个字符串,每行一个,含义见题目描述。

注意:如果这个字符串是 0,说明所有字符串都读完了。这个 0 不认为是一个“非复读字符串”。

输出格式

共一行,表示所有非复读字符串,按照行号从小到大依次连接的结果。

样例 #1

样例输入 #1

cc
b
a
cc
0

样例输出 #1

ccba

提示

【数据范围】

字符串的个数不超过 500500 个,字符串总长度不超过 5000050000,每个字符串中只包含小写字母、数字、 .!&,不包含空格等特殊符号。

思路分析

  • 1.首先对于这道题我们毫无疑问的使用哈希表是比较方便的
  • 2.但是要注意的一点是,哈希表(unordered_map)的排序有一个默认值,也就是说,直接这样存储,输出的顺序会出现问题
  • 3.由此,我们需要另外的一个动态数组(vector)来记录存储字符串
  • 4.最后再用vector数组来输出答案

代码展示

#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;

int main()
{
	unordered_map<string, int>mp;
	vector<string>v;
	while (true) {
		string s;
		cin >> s;
		if (s[0] == '0')break;
		if (mp.count(s) == 0) {
			mp[s] = 1;
			v.push_back(s);
		}
	}
	for (int i = 0; i < v.size(); i++)cout << v[i];
	return 0;
}

PS:这是练习赛的第一题,但是任然用到了STL容器,所以初学者真的难拿到省奖,还需要再次磨炼~