[PAT-A 1022]Digital Library

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目大意:
给出N本书的编号,作者,书名,关键词,出版社及年份,并给出M个查询,每个查询给出书名,作者,关键词及出版年份中的一个,要求输出满足该给出信息的所有编号

思路:
1)建立<map><string,set<int>>映射,分别建立书名,作者,关键词,出版社年份与对应id的映射关系。
2)对于每本书的多个关键词,使用cin读入单个关键词,每读入一个单词,用getchar()接收后面的字符,如果是换行符,说明关键词的输入结束,如果是空格,说明后面还是有。

注意:
1)string类型的变量使用cout或者cin输出输入

cout << type << ": " << temp << endl;
printf("%d: %s\n", type, temp.c_str());
//使用printf输出stirng类型,输入同理,会出现问题,尽量不要用

2)getline()与cin
区别string类型与C中的字符串。
getline()是string.h下的函数。
cin以流输入读入缓冲区,默认以空格(TAB,\n)作为结束符,但不会舍弃掉空格,读入下一个单词需要过滤掉后面的空格,使用getchar()或是cin.get()(相当于c++下的getchar())
如输入书本关键字的时候

while (cin >> key) {
	mpKey[key].insert(id);
	c = getchar();//每一个单词结束之后判断结束符是空格还是换行符
	if (c == '\n')break;
}

getline(cin,str)从当前位置一直读到一行末尾,读入string类型的str中。以默认换行符为结束,会自动舍弃掉末尾换行符,不用getchar或cin.get()。
如在最后读入查询信息的时候

(void)scanf("%d: ", &type);//先格式化读入type
getline(cin, temp);//从当前位置开始以换行符为终止将字符串读入temp中。

3)如果单独把查询操作提炼成一个函数,那么一定要对参数使用引用,否则会超时。

AC代码:

//PAT_A 1022
#include<iostream>
#include<cstdio>
#include<string>
#include<set>
#include<map>
using namespace std;
map<string, set<int> >mpTitle, mpAuthor, mpKey, mpPub, mpYear;
void query(map<string, set<int>>& mp, string& str) {
	if (mp.find(str) == mp.end())printf("Not Found\n");
	else {
		for (set<int>::iterator it = mp[str].begin(); it != mp[str].end(); it++) {
			printf("%07d\n", *it);
		}
	}
}
int main() {
	int n, m, id, type;
	string title, author, key, pub, year;
	(void)scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		(void)scanf("%d", &id);
		char c = getchar();
		getline(cin, title);
		mpTitle[title].insert(id);
		getline(cin, author);
		mpAuthor[author].insert(id);
		while (cin >> key) {
			mpKey[key].insert(id);
			c = getchar();
			if (c == '\n')break;
		}
		getline(cin, pub);
		mpPub[pub].insert(id);
		getline(cin, year);
		mpYear[pub].insert(id);
	}
	string temp;
	(void)scanf("%d", &m);
	for (int i = 0; i < m; i++) {
		(void)scanf("%d: ", &type);
		getline(cin, temp);
		cout << type << ": " << temp << endl;
		//printf("%d: %s\n", type, temp.c_str());
		if (type == 1)query(mpTitle, temp);
		else if (type == 2)query(mpAuthor, temp);
		else if (type == 3)query(mpKey, temp);
		else if (type == 4)query(mpPub, temp);
		else if (type == 5)query(mpYear, temp);
	}
	return 0;
}
发布了142 篇原创文章 · 获赞 1 · 访问量 4564

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104312746