题目大意:给出N本书的信息,包括标题、作者、关键字等等,要求根据查询的关键字输出对应的书的id。
没什么算法思想,信息和id之间的对应用map即可,主要问题在①同一个信息可能对应多本书,因此可以用set或者vector来存储书的信息,即map<string, set<string>>或map<string, vector<string>>,实测两种写法耗时差不多。②关键字的处理,关键字是用空格分开的,因此要正确得到每个关键字,先在整行之后加上一个空格,然后依次查找空格的位置并处理关键字。
AC代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <map>
using namespace std;
map<string, set<string>> mp[5];
int main()
{
int N;
scanf("%d\n", &N);
for (int i = 0; i < N; ++i)
{
string id, title, author, keyWords, publisher, year;
getline(cin, id);
getline(cin, title);
getline(cin, author);
getline(cin, keyWords);
getline(cin, publisher);
getline(cin, year);
mp[0][title].insert(id);
mp[1][author].insert(id);
mp[3][publisher].insert(id);
mp[4][year].insert(id);
keyWords += " ";
while(keyWords.find(" ") != string::npos)
{
int pos = keyWords.find(" ");
mp[2][keyWords.substr(0, pos)].insert(id);
keyWords.erase(keyWords.begin(), keyWords.begin() + pos + 1);
}
}
int K;
scanf("%d\n", &K);
for (int query = 0; query < K; ++query)
{
string str;
getline(cin, str);
printf("%s\n", str.c_str());
int q = str[0] - '0' - 1;
str.erase(str.begin(), str.begin() + 3);
if(mp[q].find(str) != mp[q].end())
{
for(set<string>::iterator it = mp[q][str].begin(); it != mp[q][str].end(); it++)
printf("%s\n", (*it).c_str());
}
else printf("Not Found\n");
}
return 0;
}