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