分析:题目的要求就是建立一个一对多的映射,一个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;
}