1039 Course List for Student (25分)/用scanf、printf输入输出string

题目链接
开始是用的cin和cout对代码中的每个string进行输入输出,但是由于最后一个测试点数据量大,而cin、cout效率并不高,因此导致最后一个测试点运行超时。柳神是用字符串hash的方法做的,但是我觉得这样特别麻烦,于是抱着试一试的心态把cin\cout换成了scanf\printf,结果还真的AC了。以后遇到这种题这样做不失为一种好的方法。

AC代码

#include 
#include 
#include 
#include 
using namespace std;
map<string, set<int>> list;
int main() {
	int n, k;
	cin >> n >> k;
	for (int i = 0; i < k; i++) {
		int id, num;
		scanf("%d%d", &id, &num);
		for (int j = 0; j < num; j++) {
			string name; name.resize(4); //需要预分配空间
			scanf("%s", name.c_str());
			list[name].insert(id);
		}
	}
	for (int i = 0; i < n; i++) {
		string name; name.resize(4); scanf("%s", name.c_str());
		printf("%s %d", name.c_str(), list[name].size());
		for (auto it = list[name].begin(); it != list[name].end(); it++) {
			printf(" %d", *it);
		}
		printf("\n");
	}
	return 0;
}

注意如果使用scanf输入string需要预分配内存

为什么这里要预分配内存呢?查阅了官方文档也没有查到什么有用的信息,甚至对scanf输入string很多人都持反对的态度。但是其实是可以的,但是需要预分配内存,下面是没有预分配空间的调试信息。可以看到name显示的内容是"LOR6",可是其size居然为0,证明变量空间出现了问题。
看到有大佬是这样解释的:

因为scanf是标准输入流,没有缓存区,需要预先分配空间,而cin是输入流,它使用了缓冲区。

在这里插入图片描述

类似的题目

类似的PAT甲级题还有:1047 Student List for Course


方法二

还有另一种方法可以避免用cin输入string

char temp[16];
scanf("%s", temp);
s = temp;  //字符数组初始化string

1039 Course List for Student (25分)/用scanf、printf输入输出string_第1张图片

你可能感兴趣的:(PAT)