使用map的做字符串索引
最后一个测试点数据量很大,用unordered_map和scanf速度会更快一点,可以勉强通过测试(有时可以通过)
#include<bits/stdc++.h>
using namespace std;
int N, K;
unordered_map<string, vector<int> > stu_course;
int main() {
cin >> N >> K;
for(int i = 0;i < K;++i){
int course, M;
scanf("%d %d", &course, &M);
for(int j = 0;j < M;++j){
string stu;
cin >> stu;
stu_course[stu].push_back(course);
sort(stu_course[stu].begin(), stu_course[stu].end());
}
}
for(int i = 0;i < N;++i) {
string query;
cin >> query;
cout << query << " " << stu_course[query].size();
for(int course: stu_course[query]) {
printf(" %d", course);
}cout << endl;
}
return 0;
}
使用字符串hash作为map的索引
#include<bits/stdc++.h>
using namespace std;
int N, K;
vector<int> stu_course[26*26*26*10 + 1]; // 三个字母和一个数字组成的字符串哈希所产生的值有26^3 * 10那么大
// unordered_map<int, vector<int> > stu_course; // 只要不用string,用map也不会超时
int strHash(char str[]) {
int id = 0;
for(int i = 0;i < 3;++i) {
id = id * 26 + (str[i] - 'A');
}
id = id * 10 + str[3] - '0';
return id;
}
int main() {
cin >> N >> K;
for(int i = 0;i < K;++i){
int course, M;
scanf("%d %d", &course, &M);
for(int j = 0;j < M;++j){
char name[5];
scanf("%s", name);
int stuhash = strHash(name);
stu_course[stuhash].push_back(course);
}
}
for(int i = 0;i < N;++i) {
char query[5];
scanf("%s", query);
int queryHash = strHash(query);
cout << query << " " << stu_course[queryHash].size();
sort(stu_course[queryHash].begin(), stu_course[queryHash].end());
for(int course: stu_course[queryHash]) {
printf(" %d", course);
}cout << endl;
}
return 0;
}