题目如下:

A Digital Library contains millions of books, stored according to their titles, authors, key words of their abstracts, publishers, and published years. Each book is assigned an unique 7-digit number as its ID. Given any query from a reader, you are supposed to output the resulting books, sorted in increasing order of their ID's.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the total number of books. Then N blocks follow, each contains the information of a book in 6 lines:

Line #1: the 7-digit ID number;
Line #2: the book title -- a string of no more than 80 characters;
Line #3: the author -- a string of no more than 80 characters;
Line #4: the key words -- each word is a string of no more than 10 characters without any white space, and the keywords are separated by exactly one space;
Line #5: the publisher -- a string of no more than 80 characters;
Line #6: the published year -- a 4-digit number which is in the range [1000, 3000].
It is assumed that each book belongs to one author only, and contains no more than 5 key words; there are no more than 1000 distinct key words in total; and there are no more than 1000 distinct publishers.

After the book information, there is a line containing a positive integer M (<=1000) which is the number of user's search queries. Then M lines follow, each in one of the formats shown below:

1: a book title
2: name of an author
3: a key word
4: name of a publisher
5: a 4-digit number representing the year
Output Specification:

For each query, first print the original query in a line, then output the resulting book ID's in increasing order, each occupying a line. If no book is found, print "Not Found" instead.

Sample Input:


3
1111111
The Testing Book
Yue Chen
test code debug sort keywords
ZUCS Print
2011
3333333
Another Testing Book
Yue Chen
test code sort keywords
ZUCS Print2
2012
2222222
The Testing Book
CYLL
keywords debug book
ZUCS Print2
2011
6
1: The Testing Book
2: Yue Chen
3: keywords
4: ZUCS Print
5: 2011
3: blablabla

Sample Output:


1: The Testing Book
1111111
2222222
2: Yue Chen
1111111
3333333
3: keywords
1111111
2222222
3333333
4: ZUCS Print
1111111
5: 2011
1111111
2222222
3: blablabla
Not Found

这道题目我参考了sunbaigui的解法,这是一道通过属性值来找记录的问题,属于倒排索引,由于属性值较多,需要使用多个map进行存储,对于多个ID公用多个属性值的问题,可以把map的ID那一维设置为vector,从而可以容纳多个ID,为了满足ID的升序输出,需要对每个map中的记录按照ID升序进行排序。

通过学习sunbaigui的代码,我学到了一些细节如下:

1.map可以通过索引值直接插入:

例如map<string,int> mm 一般的插入方式为mm.insert(pair<string,int>("str",100))

还可以通过mm[“str”] = 100来实现插入

2.由于题目中的字符串有空格出现,因此应该使用getline(cin,str)来获取每一个字符串,注意使用getline时如果前面有其他类型的输入,例如cin和scanf,应当加一个getchar()吃掉回车符。

3.对于一个以空格分隔的多个关键词组成的字符串,要提取出每一个部分,使用sstream头文件中的istringstream来分离每个部分,设keywords中存储着多个以空格分隔的关键词,具体实现为:

istringstream istr(keywords);
while(!istr.eof()){string keyword;istr >> keyword;// 此时keyword中存的为一个关键词,istr每输出一次就后移一个,直到EOF
}

4.map的find函数只能找第一维的内容。

5.要对容器排序,首先保证容器内存储的类型有<符,然后调用sort函数传入begin和end迭代器。

题目的具体实现为:

定义5个map,每个map的第一维为string,第二维为vector<string>,其中第一维保存不同的属性值,第二维保存各个属性值对应的ID,在输入记录的过程中不断把记录存入map,接着对第二维进行排序,这时候得到的所有记录就是按照ID的升序排列的了,在查找时对不同的查找类型选择不同的map,如果找到,则可以得到一个ID容器,输出容器中所有ID即可,找不到则输出Not Found。

由于输入缓冲区和输出缓冲区是分离的,因此可以在输入一条记录后立即打印一条结果。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
#include<sstream>
#include<stdio.h>
using namespace std;int main()
{map<string,vector<string> > infoMaps[5];string ID,title,author,keywords,publisher,year;int N;scanf("%d",&N);for(int i = 0; i < N; i++){getchar(); // 吃掉每次输入结尾的回车。getline(cin,ID);getline(cin,title);getline(cin,author);getline(cin,keywords);getline(cin,publisher);cin >> year;infoMaps[0][title].push_back(ID);infoMaps[1][author].push_back(ID);infoMaps[3][publisher].push_back(ID);infoMaps[4][year].push_back(ID);istringstream istr(keywords);while(!istr.eof()){string keyword;istr >> keyword;infoMaps[2][keyword].push_back(ID);}}for(int i = 0; i < 5; i++){map<string, vector<string> >::iterator it;for(it = infoMaps[i].begin(); it!=infoMaps[i].end(); it++){sort(it->second.begin(),it->second.end());}}cin >> N;int index;string query;for(int i = 0; i < N; i++){scanf("%d: ",&index);getline(cin,query);cout << index << ": " << query << endl;map<string, vector<string> >::iterator it;it = infoMaps[index - 1].find(query);if(it != infoMaps[index - 1].end()){vector<string> IDs = it->second;for(int cnt = 0; cnt < IDs.size(); cnt++){cout << IDs[cnt] << endl;}}else{cout << "Not Found" << endl;}}return 0;
}

1022. Digital Library (30) -map -字符串处理相关推荐

  1. PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询

    文章目录 题目分析 题目链接 题目分析 分析: 一本书信息由6个,想到用结构体来存. 至于每一个信息可以用string来存,而关键字在想使用vector<string> keywords还 ...

  2. 1022. Digital Library (30)

    考察倒排索引 #include<iostream> #include<string> #include<vector> #include<algorithm& ...

  3. 1022 Digital Library (30 分) 【难度: 中 / 知识点: 哈希表】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336 解析: 将每一部分都用哈希表映射.映射的结果 ...

  4. 1022. Digital Library

    字符串处理能力有待提高 // 1022. Digital Library.cpp: 主项目文件.#include "stdafx.h" #include <cstdio> ...

  5. 1022 Digital Library

    1. 关键数据结构 map<string,vector<string> > mp[6] 其中mp[1]代表从书名映射到id(id可能无,可能不止一个,所以要用vector),m ...

  6. pat 甲级 1022 Digital Library 报错,格式错误等

    当你被1022题搞得恼羞成怒,反复检查代码准确无误,怀疑是输出格式问题时(你可能已经测试了两种不同格式) 那么我相信看到这篇文章的你编写的程序应该是准确的,只是PAT题目编写的随意程度再次令人乍舌. ...

  7. 【PAT甲级 - C++题解】1022 Digital Library

    ✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343

  8. PTA-1022——Digital Library

    题目: A Digital Library contains millions of books, stored according to their titles, authors, key wor ...

  9. ACM Digital Library访问及完整联动Zotero

    The ACM Digital Library(Association for Computing Machinery)创立于1947年,是全球历史最悠久和最大的计算机教育.科研机构.数据库收录了美国 ...

最新文章

  1. html前端登录验证码,前端登录页面开发_js生成验证码并验证
  2. JAVA多线程:线程创建过程以及生命周期总结
  3. 从零开始学习OpenCL开发(一)架构
  4. 再分享 5 个 vs 调试技巧
  5. .NET CoreCLR开发人员指南(上)
  6. C和指针之数组和函数部分总结
  7. P3733 [HAOI2017]八纵八横(线性基/线段树分治)
  8. 卸载exchange后注意事项
  9. linux查看程序中最耗时的代码,【Linux】CPU时间与处理器耗时
  10. QT学习小结之信号与槽
  11. IOS: iPhone键盘通知与键盘定制
  12. 【附源码】计算机毕业设计SSM小区宠物管理系统
  13. 浅谈《分布式光伏发电系统电气安全技术规范》
  14. [工具书]IntelliJ IDEA社区版下载及配置 - ZIP版
  15. 【SIPp】Linux-SIPp3.6.0 测试FreeSwitch
  16. 【20200207】【lyk】TJOI2019 唱、跳、rap、篮球题解
  17. 【视觉-摄像机3】}摄像机镜头--焦距与视角(选相机和镜头)
  18. 各种框架性能分析,和语言性能分析
  19. css实现3d正方体旋转
  20. 一个遮罩层怎么遮罩两个图层_premiere遮罩功能在哪儿_怎么在视频中加遮罩图层_遮罩图层制作教程详解...

热门文章

  1. CKEditor教程
  2. 英语语法第二节(句子成分)
  3. 集五福编程c语言,支付宝如何快速集齐5张福卡 支付宝2020集五福攻略技巧
  4. 求一款电脑上的剪辑音乐软件
  5. 网站文章SEO标题怎么设置比较好?
  6. 大学物理简明教程 第3版修订版课后习题答案
  7. 2022年,再见!2023年,你好!
  8. 录ppt的时候录光标_使用 PowerPoint 轻松搞定 Windows 电脑录屏丨一日一技
  9. 趣头条广告投放的效果怎么样?趣头条广告开户找哪里?
  10. 如何通过电脑发送短信——开始篇