题目链接: 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 }