1022 Digital Library
题目大意
给出N本书的编号、书名、作者、关键词(多个)、出版社、出版年份,然后给出M个查询,可能是书名、作者、关键词(多个)、出版社、出版年份中的一个,给出所有满足条件的书的编号。
注意
1、只有编号唯一,所以一一建立书名、作者、关键词、出版社、出版年份和书名的映射。问题是,一个书名/作者/关键词…会和多个书名映射,即一对多的映射,所以要用map<string,set< int >>。注意set插入、查询、删除的操作。
2、关键词有多个,输入时要注意吸收掉空格。
代码
#include<stdio.h>
#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std;
map<string,set<int>>mpTitle,mpAuhor,mpKey,mpPub,mpYear;
void query(map<string,set<int>> &mp,string &str){
if(mp.find(str)!=mp.end()){
for(set<int>::iterator it=mp[str].begin();it!=mp[str].end();it++){
printf("%07d\n",*it);}
}
else printf("Not Found\n");
}
//只有ID是唯一的
int main(void){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int id;
string title,author,key,pub,year;
scanf("%d%*c",&id);//注意吸收掉换行符
getline(cin,title);
mpTitle[title].insert(id);
getline(cin,author);
mpAuhor[author].insert(id);
//读取多个关键词
char c;
while(true){
cin>>key;
mpKey[key].insert(id);
c=getchar();//吸收掉空格
if(c=='\n')break;//如果是换行符跳出
}
getline(cin,pub);
mpPub[pub].insert(id);
getline(cin,year);
mpYear[year].insert(id);
}
int m;
scanf("%d%*c",&m);
for(int i=0;i<m;i++){
string search;
getline(cin,search);
printf("%s\n",search.c_str());
int tmp = search[0]-'0';
search.erase(search.begin(),search.begin()+3);
switch(tmp)
{
case 1:
query(mpTitle,search);break;
case 2:
query(mpAuhor,search);
break;
case 3:
query(mpKey,search);break;
case 4:
query(mpPub,search);break;
case 5:
query(mpYear,search);break;
}
}
}