欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[PAT-A 1022]Digital Library

程序员文章站 2024-03-17 21:38:52
...

[PAT-A 1022]Digital Library
[PAT-A 1022]Digital Library
[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;
}
相关标签: PAT-A