PAT甲级(Advanced Level) Practice 1022 Digital Library
原题
1022 Digital Library - PAT (Advanced Level) Practice
题目大意
给定一本书的id、书名、作者、(多个)关键词、出版社、出版年份,根据输入的书名、作者、(其中一个)关键词、出版社、出版年份按大小顺序返回id
解题思路
先吐槽一句,题目简单是简单,麻烦是真麻烦...
利用哈希表来储存元素,由于可能多本书有相同的关键字,因此用vector<string>来储存答案的id。
另外,对于keywords,我们要额外进行空格分割,再分别将每一个关键词存入哈希表。
代码(c++)
#include <bits/stdc++.h>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 10010;
int n, m;
unordered_map<string, vector<string>> title_m; // 书名哈希表
unordered_map<string, vector<string>> author_m; // 作者哈希表
unordered_map<string, vector<string>> key_m; // 关键词哈希表
unordered_map<string, vector<string>> publisher_m; // 出版社哈希表
unordered_map<string, vector<string>> year_m; // 年份哈希表
void split(string s, unordered_map<string, vector<string>> &m, string id) { // 根据空格分割关键词
int len = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] == ' ') {
string str = s.substr(i - len, len);
m[str].push_back(id);
len = -1; // len为-1因为马上下面就要+1了
}
len++;
}
string str = s.substr(s.size() - len);
m[str].push_back(id);
}
bool find_id(const string& search, const unordered_map<string, vector<string>>& m) {
auto it = m.find(search);
if (it != m.end()) // 找到,排序输出并返回true
vector<string> res = it->second;
sort(res.begin(), res.end());
for (string id : res) cout << id << endl;
return true;
}
return false;
}
int main() {
string sn;
getline(cin, sn); // 此处用getline读入,防止有其他空格
n = atoi(sn.c_str());
for(int i = 0; i < n; i++) {
string id, title, author, key, publisher, year;
getline(cin, id);
getline(cin, title);
getline(cin, author);
getline(cin, key);
getline(cin, publisher);
getline(cin, year);
title_m[title].push_back(id);
author_m[author].push_back(id);
publisher_m[publisher].push_back(id);
split(key, key_m, id);
year_m[year].push_back(id);
}
string sm;
getline(cin, sm);
m = atoi(sm.c_str());
vector<string> ans;
for (int i = 0; i < m; i++) {
string search_id;
getline(cin, search_id);
cout << search_id << endl;
string search = search_id.substr(3, search_id.size() - 3); // 注意输入的search是带id的,先去掉
if (find_id(search, title_m)) continue;
if (find_id(search, author_m)) continue;
if (find_id(search, key_m)) continue;
if (find_id(search, publisher_m)) continue;
if (find_id(search, year_m)) continue;
cout << "Not Found" << endl;
}
}