直接用 string 存储名字会由于C++的 cin, cout IO效率问题导致最后一个case超时,于是改为char数组存储名字,然后Hash为整数,再创建映射。
#include <iostream>
#include <cstdio>
#include <set>
#include <unordered_map>
#include <cstring>
using namespace std;
int Hash(char *name){
return (name[0]-'A'+10)*36*36*36 + (name[1]-'A'+10)*36*36 + (name[2]-'A'+10)*36 + (name[3]-'0');
}
int main(){
int n, k;
scanf("%d%d", &n, &k);
unordered_map<int, set<int>> stus;
char name[5];
for(int i = 0; i < k; ++i){
int index, num;
scanf("%d%d", &index, &num);
for(int j = 0; j < num; ++j){
scanf("%s", name);
int val = Hash(name);
if(stus.find(val) == stus.end()) stus.insert({val, set<int>()});
stus[val].insert(index);
}
}
for(int i = 0; i < n; ++i){
scanf("%s", name);
int val = Hash(name);
printf("%s %d", name, (int)stus[val].size());
for(auto& course : stus[val]){
printf(" %d", course);
}
printf("\n");
}
return 0;
}