传统方法超时一组数据。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
#define MAX 200
struct Course
{
int index;
int num;
char name[200][5];
}course[2500+10];
int cmp(const void *a, const void *b)
{
return (*(Course*)a).index - (*(Course*)b).index;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int N = 0, K = 0;
scanf("%d %d", &N, &K);
for (int i = 0; i < K; i++)
{
scanf("%d %d", &course[i].index, &course[i].num);
for (int j = 0; j < course[i].num; j++)
scanf("%s", course[i].name[j]);
}
qsort(course, K, sizeof(course[0]), cmp);
char tname[5];
int c[2500], cnt = 0;
while (N--)
{
memset(c, 0, sizeof(c));
cnt = 0;
scanf("%s", tname);
for (int i = 0; i < K; i++)
{
for (int j = 0; j < course[i].num; j++)
{
if (!strcmp(tname, course[i].name[j]))
{
c[cnt++] = course[i].index;
break;
}
}
}
printf("%s %d", tname, cnt);
for (int i = 0; i < cnt; i++)
printf(" %d", c[i]);
printf("\n");
}
return 0;
}
//////////////////////////////////////////////////////////
哈希+vector#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;
const int M = 26*26*26*10+1;
vector<int> selectCourse[M];
int getId(char name[])
{
int id = 0;
for (int i = 0; i < 3; i++)
id = id*26 + (name[i]-'A');
id = id*10 + (name[3]-'0');
return id;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int N = 0, K = 0;
scanf("%d %d", &N, &K);
for (int i = 0; i < K; i++)
{
int index, num, ID;
scanf("%d %d", &index, &num);
char name[5];
for (int j = 0; j < num; j++)
{
scanf("%s", name);
ID = getId(name);
selectCourse[ID].push_back(index);
}
}
while (N--)
{
int ID;
char name[5];
scanf("%s", name);
ID = getId(name);
sort(selectCourse[ID].begin(), selectCourse[ID].end());
printf("%s %d", name, selectCourse[ID].size());
for (int i = 0; i < selectCourse[ID].size(); i++)
printf(" %d", selectCourse[ID][i]);
printf("\n");
}
return 0;
}