版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37360631/article/details/88756484
分析:题目的要求就是建立一个一对多的映射,一个id对应多个属性,包括书名,作者,关键字,出版,年份。这里用到了map<int,set >进行存储。
(1)输入关键词,并没有给定关键词的个数,因此这里采用了一个技巧:
while(cin >> tkey) {
key[tkey].insert(id);
char c = getchar();
if(c == '\n') break;
}
**
(2)这里面一定要注意,在getline前面如果使用了cin读取一个数字,那么在cin的后面一定要加上getchar()读取掉换行符。
**
(3)这里传参必须要用引用的形式,否则最后一个测试点会超时。
#include<bits/stdc++.h>
using namespace std;
int n,m,id;
map<string,set<int> > title,author,key,pub,year;
string ti,au,tkey,pu,ye;
void query(map<string,set<int> > &mp,string &s){
set<int>::iterator it;
if(mp.find(s)!=mp.end()){
for(it=mp[s].begin();it!=mp[s].end();++it){
printf("%07d\n",*it);
}
}
else{
cout<<"Not Found"<<endl;
}
}
int main(){
//std::ios::sync_with_stdio(false);
cin>>n;
for(int i = 0; i < n; i++) {
scanf("%d\n", &id);
getline(cin, ti);
title[ti].insert(id);
getline(cin, au);
author[au].insert(id);
while(cin >> tkey) {
key[tkey].insert(id);
char c = getchar();
if(c == '\n') break;
}
getline(cin, pu);
pub[pu].insert(id);
getline(cin, ye);
year[ye].insert(id);
}
// for(int i=0;i<n;i++){
// cin>>id;
// getchar();
// getline(cin,ti);
// title[ti].insert(id);
//
// getline(cin,au);
// author[au].insert(id);
//
// while(cin>>tkey){
// key[tkey].insert(id);
// char c=getchar();
// if(c=='\n') break;
// }
// getline(cin,pu);
// pub[pu].insert(id);
//
// getline(cin,ye);
// year[ye].insert(id);
// }
cin>>m;
int x;
for(int i=0;i<m;i++){
scanf("%d: ",&x);
string s;
getline(cin,s);
cout<<x<<": "<<s<<endl;
if(x==1){ query(title,s);}
else if(x==2) {query(author,s);}
else if(x==3) {query(key,s);}
else if(x==4) {query(pub,s);}
else if(x==5) {query(year,s);}
}
return 0;
}