PAT A 1022 Digital Library (30 分)

it2024-12-27  18

一、题目概述&样例

二、技巧

1、 由于索引没有顺序要求,使用unordered_map可以节省大量运行时间;

2、 一行内读取多个空格分割的字符串 由于cin不读取空格和换行,因此cin后在读取一个字符,根据字符为换行还是空格判断是否结束;

while( cin >> str ) { map_book[3][str].push_back(ID); if( ( c = getchar() ) == '\n' ) break; }

3、 getline( cin, str );可以用于string格式获取整行;

4、使用getline易错点:

输入为:

2 BLABLABLABLA

若使用

scanf("%d", &N);//此处未输入\n getlin(cin, str);

则str中仅读取到换行符; scanf()读取整形应连换行一起读入:scanf("%d\n", &N);

5、map.find()找到匹配关键字返回指针,未找到时返回的指针指向map.end()

三、代码

#include <cstdio> #include <iostream> #include <string> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { int N, M; string str; scanf("%d", &N); unordered_map<string, vector<int>> map_book[6]; for( int i = 0, ID, y; i < N; ++i ) { char c; scanf("%d\n", &ID); getline( cin, str ); map_book[1][str].push_back(ID); getline( cin, str ); map_book[2][str].push_back(ID); while( cin >> str ) { map_book[3][str].push_back(ID); if( ( c = getchar() ) == '\n' ) break; } getline( cin, str ); map_book[4][str].push_back(ID); getline( cin, str ); map_book[5][str].push_back(ID); } scanf("%d\n", &M); for( int i = 0, tag; i < M; ++i ) { getline( cin, str ); tag = str[0] - '0'; cout << str << endl; str.erase(str.begin(), str.begin() + 3); if( map_book[tag].find(str) == map_book[tag].end() ) printf("Not Found\n"); else { sort( map_book[tag][str].begin(), map_book[tag][str].end(), [] (int a, int b) { return a < b; } ); for( int i = 0; i < map_book[tag][str].size(); ++i ) printf("%07d\n", map_book[tag][str][i]); } } }
最新回复(0)