题目粗心:

给出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];// 解决keywordsvoid 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;}