PAT 1022 Digital Library

54 篇文章 1 订阅

原文链接:欢迎大家访问我的个人博客

原题链接

  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值