[PAT-A 1022]Digital Library
程序员文章站
2024-03-17 21:38:52
...
题目大意:
给出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 1022]Digital Library
-
PAT 1022 Digital Library
-
PAT.A1022 Digital Library
-
PAT A1022. Digital Library (30)
-
PAT甲级 1022 Digital Library (30分)
-
【PAT甲级 映射】1022 Digital Library (30 分)
-
PAT甲级 1022 Digital Library (暨 set、map总结)
-
PAT 甲级 1022 Digital Library
-
PAT 甲级 1022 Digital Library
-
PAT甲级-1022-Digital Library(map映射+倒排索引)