PAT 1039

题目链接: http://pat.zju.edu.cn/contests/pat-a-practise

题目不难,但是最后一个case数据量大,用map会超时,所以根据学生姓名建立四维数组,方便查询。

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 struct Node
 7 {
 8     char name[10];
 9 };
10 
11 int main()
12 {
13     int N, K;
14     while(scanf("%d%d", &N, &K) != -1)
15     {
16         /*根据学生姓名建的四维数字将学生名字转化为数字存储,
17         在windows下声明这个数组会栈溢出,因为超过windows下函数内栈大小,
18         另外,换成cin cout最后一个case会超时*/
19         vector<int> check[26][26][26][10];
20         vector<Node> list(N);
21         for(int i=0; i<K; ++i)
22         {
23             int num, r; scanf("%d%d", &num, &r);
24             for(int j=0; j<r; ++j)
25             {
26                 char name[10]; 
27                 scanf("%s", name);
28                 int a=name[0]-'A';
29                 int b=name[1]-'A';
30                 int c=name[2]-'A';
31                 int d=name[3]-'0';
32                 check[a][b][c][d].push_back(num);
33             }
34         }
35         for(int i=0; i<N; ++i)
36             scanf("%s",list[i].name);
37         for(int i=0; i<list.size(); ++i)
38         {
39             int a=list[i].name[0]-'A';
40             int b=list[i].name[1]-'A';
41             int c=list[i].name[2]-'A';
42             int d=list[i].name[3]-'0';
43             if(check[a][b][c][d].size() == 0)
44                 printf("%s 0
", list[i].name);
45             else
46             {
47                 sort(check[a][b][c][d].begin(), check[a][b][c][d].end());
48                 int length = check[a][b][c][d].size();
49                 printf("%s %d", list[i].name, length);
50                 for(int j=0; j<length; ++j)
51                     printf(" %d", check[a][b][c][d][j]);
52                 printf("
");
53             }
54         }
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/bochen-sam/p/3383244.html