题目
Zhejiang University has 40000 students and provides 2500 courses. Nowgiven the registered course list of each student, you are supposed to outputthe student name lists of all the courses.
Input Specification:
Each input file contains one test case. For each case, the first linecontains 2 numbers: N (<=40000), the total number of students, and K(<=2500), the total number of courses. Then N lines follow, each contains astudent's name (3 capital English letters plus a one-digit number), a positivenumber C (<=20) which is the number of courses that this student hasregistered, and then followed by C course numbers. For the sake of simplicity,the courses are numbered from 1 to K.
Output Specification:
For each test case, print the student name lists of all the courses inincreasing order of the course numbers. For each course, first print in oneline the course number and the number of registered students, separated by aspace. Then output the students' names in alphabetical order. Each nameoccupies a line.
Sample Input:
10 5
ZOE1 2 4 5
ANN0 3 5 2 1
BOB5 5 3 4 2 1 5
JOE4 1 2
JAY9 4 1 2 5 4
FRA8 3 4 2 5
DON2 2 4 5
AMY7 1 5
KAT3 3 5 4 2
LOR6 4 2 4 1 5
Sample Output:
1 4
ANN0
BOB5
JAY9
LOR6
2 7
ANN0
BOB5
FRA8
JAY9
JOE4
KAT3
LOR6
3 1
BOB5
4 7
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
5 9
AMY7
ANN0
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
类似1039,需要将名字转换为id,再排序。
否则会增加排序时比较的代价,而这个代价的倍数是n*log(n)的,会导致超时
代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int To_id(char name[5]); //名字转id
void To_name(int id,char name[5]); //id转名字
int main()
{
int n,k;
vector<int> course[2501]; //对应课程编号的选择的人
cin>>n>>k;
int num_reg,temp_cou,i,j; //每门课选的人,输入某个人选的课的临时数据
char name[5]; //名字
for(i=0;i<n;i++) //循环输入数据
{
scanf("%s",name);
scanf("%d",&num_reg);
for(j=0;j<num_reg;j++)
{
scanf("%d",&temp_cou);
course[temp_cou].push_back(To_id(name));
}
}
for(i=1;i<=k;i++) //输出各门课的信息
{
printf("%d %d\n",i,course[i].size());
if(!course[i].empty())
{
sort(course[i].begin(),course[i].end());
for(j=0;j<course[i].size();j++)
{
To_name(course[i][j],name);
printf("%s\n",name);
}
}
}
return 0;
}
int To_id(char name[5])
{
return (name[0]-'A')*6760+(name[1]-'A')*260+(name[2]-'A')*10+name[3]-'0';
}
void To_name(int id,char name[5])
{
name[0]=id/6760+'A';
id%=6760;
name[1]=id/260+'A';
id%=260;
name[2]=id/10+'A';
id%=10;
name[3]=id+'0';
}