原文链接:欢迎大家访问我的个人博客
原题链接
PAT 1022 Digital Library (30分)
考点
数据输入 map
思路
我想大家拿到题目首先想到的方法肯定是用结构体来进行数据的存储,在根据查询的条件进行筛选输出。但是我在这篇博客中获得了新的思路。
使用map<string,set<int> >
将每一个查询的条件与其相对应的集合进行连接。在输入的时候,就将查询的结果输入到对应的集合中,这样无疑大大缩短了查询的时间。
其中值得注意的是,作者名、书名等都是有空格的,使用cin无疑是没有办法实现的,因此这里使用getline来接收这一行的输入。在关键词那里,因为输入中没有给定关键词的个数,因此需要getchar()来判断关键词的结束标志。
代码
#include <bits/stdc++.h>
using namespace std;
map<string,set<int> > title,author,key,pub,year;
void search(map<string,set<int> > &m,string &str){
if(m.find(str)!=m.end()){
set<int>::iterator it = m[str].begin();
for(; it != m[str].end(); it++)
printf("%07d\n", *it);
}else{
cout<<"Not Found\n";
}
}
int main(){
int n,m,id,num;
scanf("%d",&n);
string t,a,k,p,y;
for(int i=0;i<n;i++){
scanf("%d\n",&id);
getline(cin,t);//标题
title[t].insert(id);
getline(cin,a);//输入作者
author[a].insert(id);
while(cin>>k){//录入关键词
key[k].insert(id);
char c = getchar();
if(c=='\n') break;
}
getline(cin,p);//出版社
pub[p].insert(id);
getline(cin,y);
year[y].insert(id);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d: ",&num);
string temp;
getline(cin,temp);
cout<<num<<": "<<temp<<'\n';
if(num == 1) search(title,temp);
else if(num == 2) search(author, temp);
else if(num == 3) search(key, temp);
else if(num == 4) search(pub,temp);
else if(num ==5) search(year, temp);
}
return 0;
}