题目大意:
给出N本书的编号、书名、作者、关键词(可能有多个)、出版社及出版年份,并给出M个查询,每个查询给出书名、作者、关键词(单个)、出版社及出版年份中的一个,要求输出满足该给出信息的所有书的编号。
算法思路:
我们使用unordered_map<string,vector<int>> hashToID[6]保存5个关键字查询对应的所有已知的id,1到5分别表示title,author,keyword,publisher,publish_year
与书籍id的对应.在输入的时候,我们对于每一个输入的字符串根据其输入顺序建立不同的类别到id的映射,比如第一个输入的字符串s一定是book title
,那么就将id添加到hashToID[1][s]
中,依次类推,唯一不同的是处理keywords
的情况,这里使用了deal函数来处理,将每一个字符添加到s中,遇到空格说明是一个word,就建立该word与id的映射,不过得记得处理最后一个word(在循环内部无法处理)。在最后输出的时候,我们使用tag记录查询的类别,s为查询的关键字,如果hashToID[tag].find(s)==hashToID[tag].end()
,说明当前类别中没有该关键字,就输出Not Found
,否则输出hashToID[tag][s]
的每一个id号。
当前这种写法应该是耗时最短的了,并且代码量也较小。
注意点:
1、id号固定为7位,所以输出得保留7位有效数字,测试点3和4考察,如果使用string就不会有这个问题。
2、getline的输入前得使用getchar()接受回车,不然就会出错。
提交结果:
AC代码:
#include <cstdio>
#include <unordered_map>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
unordered_map<string,vector<int>> hashToID[6];
// 处理keywords
void deal(const string& keywords,int id){
string s;
for (char keyword : keywords) {
if(keyword!=' '){
s += keyword;
} else {
hashToID[3][s].push_back(id);
s = "";
}
}
// 处理最后一个keyword
hashToID[3][s].push_back(id);
}
int main(){
int N;
scanf("%d",&N);
int id;
string s;
for (int i = 0; i < N; ++i) {
scanf("%d",&id);// 首先输入id
getchar();// 接受回车
getline(cin,s);// 输入book title
hashToID[1][s].push_back(id);
getline(cin,s);// 输入name of an author
hashToID[2][s].push_back(id);
getline(cin,s);// 输入keywords
deal(s,id);
getline(cin,s);// 输入name of a publisher
hashToID[4][s].push_back(id);
getline(cin,s);// 输入 year
hashToID[5][s].push_back(id);
}
// 开始查询
scanf("%d",&N);
int tag;
for (int k = 0; k < N; ++k) {
scanf("%d: ",&tag);
getline(cin,s);
printf("%d: %s\n",tag,s.c_str());
if(hashToID[tag].find(s)==hashToID[tag].end()){
printf("Not Found\n");
} else {
sort(hashToID[tag][s].begin(),hashToID[tag][s].end());
for(auto &item:hashToID[tag][s]){
printf("%07d\n",item);
}
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。