1

题目大意:

给出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()接受回车,不然就会出错。

提交结果:

image.png

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;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得