1022. Digital Library (30)

1. 原题: https://www.patest.cn/contests/pat-a-practise/1022

2. 思路:

题意:
模拟信息检索。数据处理题,逻辑上不难理解。
思路:
既然检索关键字,当然会想到用map。
所以利用5个map,键值存储id。
这里键值类型用的stl中的集合,也可以用vector,再进行排序。
而set默认字典序排列。
为了简便,用了set。
检索输出时,利用key直接输出就好了。

3. 源码(已AC):

#include<iostream>
#include<string>
#include<sstream> //使用stringstream处理关键字
#include<map>
#include<set>
using namespace std;

int main()
{
	//freopen("in.txt", "r", stdin);
	int N;	//总id数
	cin >> N;
	cin.get();	//为了消除数字后的回车,下同。
	map<string, set<string> > mp[6];	//map, 构建了6个,下标0抛弃,1~5分别对应title等。

	for(int i = 0; i < N; i++)	//循环读入数据
	{
		string id, title, author, keys, publish, time;	//id可以用int,但为了方便处理,用string

		getline(cin, id);	//读入一整行。
		getline(cin, title);
		getline(cin, author);
		getline(cin, keys);
		getline(cin, publish);
		getline(cin, time);

		if(mp[1].count(title))	//下面5个map需要单独处理了,虽然有点重复。因为keywords有多个,
			mp[1][title].insert(id);	//需要单独处理。
		else
		{
			set<string> tem;
			tem.insert(id);
			mp[1][title] = tem;
		}

		if(mp[2].count(author))	//键存在,直接插入集合。
			mp[2][author].insert(id);
		else
		{	//键不存在
			set<string> tem;
			tem.insert(id);
			mp[2][author] = tem;
		}

		stringstream ss(keys);	//字符串流ss
		string word;
		while(ss >> word)	//读入关键字
		{
			if(mp[3].count(word))
				mp[3][word].insert(id);
			else
			{
				set<string> tem;
				tem.insert(id);
				mp[3][word] = tem;
			}
		}

		if(mp[4].count(publish))
			mp[4][publish].insert(id);
		else
		{
			set<string> tem;
			tem.insert(id);
			mp[4][publish] = tem;
		}

		if(mp[5].count(time))
			mp[5][time].insert(id);
		else
		{
			set<string> tem;
			tem.insert(id);
			mp[5][time] = tem;
		}
	}
	
	int M;
	cin >> M;	//检索数目
	cin.get();

	for(int i = 0; i < M; i++)	//循环输出
	{
		string buff, tem;
		getline(cin, buff);
		tem = buff.substr(3);	//取得检索字
		int index = buff[0] - '0';	//检索项下标,对应不同map

		cout << buff << endl;
		if(mp[index][tem].empty())
			cout << "Not Found" << endl;
		else
		{
			set<string>::iterator it;	//迭代器处理
			for(it = mp[index][tem].begin(); it != mp[index][tem].end(); it++)
				cout << *it << endl;
		}	
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值