直接用string会超时 名字一定是三位字母+一个数字 所以转成哈希表 来处理 会快很多。
#include <iostream>
#include <vector>
#include <algorithm>
#define MAX 26*26*26*10
using namespace std;
int N, K;
vector <int> name[MAX];
int c2i(char c) { //char2int
if( c >='A' && c <='Z')
return int( c - 'A');
if (c >= '0' && c <= '9')
return int(c - '0');
return -1;
}
int Hash(char * c) {
return (((c2i(c[0]) * 26 + c2i(c[1])) * 26 + c2i(c[2]))) * 10 + c2i(c[3]);
}
bool cmp(int n1, int n2) {
return n1 < n2;
}
int main() {
cin >> N >> K;
char c[4];
for (int i = 0; i < K; i++) {
int ClaNum, StuN;
cin >> ClaNum >> StuN;
for (int j = 0; j < StuN; j++) {
scanf("%s", c);
int na = Hash(c);
name[na].push_back(ClaNum);
}
}
for (int i = 0; i < N; i++) {
scanf("%s", c);
printf("%s ", c);
int na = Hash(c);
printf("%d", name[na].size());
if (name[na].size() != 0){
sort(name[na].begin(), name[na].end(), cmp);
for (int j = 0; j < name[na].size(); j++) {
printf(" %d", name[na][j]);
}
}
printf("\n");
}
return 0;
}