1022. Digital Library (30) -map -字符串处理
题目如下:
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 -字符串处理的更多相关文章
- PAT甲题题解-1022. Digital Library (30)-map映射+vector
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT 甲级 1022 Digital Library (30 分)(字符串读入getline,istringstream,测试点2时间坑点)
1022 Digital Library (30 分) A Digital Library contains millions of books, stored according to thei ...
- pat 甲级 1022. Digital Library (30)
1022. Digital Library (30) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A Di ...
- 1022 Digital Library (30 分)
1022 Digital Library (30 分) A Digital Library contains millions of books, stored according to thei ...
- 1022 Digital Library (30)(30 分)
A Digital Library contains millions of books, stored according to their titles, authors, key words o ...
- PAT-1022 Digital Library (30 分) 字符串处理
A Digital Library contains millions of books, stored according to their titles, authors, key words o ...
- 1022 Digital Library (30)(30 point(s))
problem A Digital Library contains millions of books, stored according to their titles, authors, key ...
- 1022. Digital Library (30)
A Digital Library contains millions of books, stored according to their titles, authors, key words o ...
- PAT Advanced 1022 Digital Library (30 分)
A Digital Library contains millions of books, stored according to their titles, authors, key words o ...
随机推荐
- Linux学习之CentOS(九)-----文件与目录的默认权限与隐藏权限
文件与目录的默认权限与隐藏权限 一个文件有若干个属性, 包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略 ...
- div,margin,padding
<!-- 类比礼品盒里装方块月饼.月饼的食用部分(我们把它称之为月饼肉身)要装在小包装盒里,月饼肉身即为content.月饼肉身与直接包裹它的小包装盒(我们把它叫做月饼的衣服)之间的距离叫pad ...
- eclipse maven could not resolve archetype之类的错误
先说下网上有种联网导入的方法 而我的是本地导入的方法 就是导入原型特慢 或者 原型下载都下载不了的问题 解决方法只能 把那个文件下载搞到本地 没有被墙 就是速度慢 http://repo1.maven ...
- 对闭包的理解(closure)
什么是闭包: 当你声明一个局部变量时,这个局部变量有作用域,通常局部变量值只存在于你定义的Block or Function中: function() { var a = 1; console.log ...
- 讨论过后而引发对EF 6.x和EF Core查询缓存的思考
前言 最近将RabbitMQ正式封装引入到.NET Core 2.0项目当中,之前从未接触过是个高大上的东东跟着老大学习中,其中收获不少,本打算再看看RabbitMQ有时间写写,回来后和何镇汐大哥探讨 ...
- XListView下拉刷新和上拉加载更多详解
转载本专栏每一篇博客请注明转载出处地址,尊重原创.博客链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/53167655 市面上有 ...
- ROS机器人程序设计(原书第2版)补充资料 (贰) 第二章 ROS系统架构及概念
ROS机器人程序设计(原书第2版)补充资料 (贰) 第二章 ROS系统架构及概念 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 由于工作事 ...
- popupwindow中EditText获取焦点后自动弹出软键盘
关于popupwindow中EditText获取焦点后自动弹出软键盘的问题,玩过手机qq或空间的童鞋应该知道,再点击评论时会弹出一个编辑框,并且伴随软键盘一起弹出是不是很方便啊,下面我们就来讲一下实现 ...
- 乐观的并发策略——基于CAS的自旋
悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题:而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后 ...
- github pages + Hexo + 域名绑定搭建个人博客
环境 Windows 10(64 位) Git-2.7.4-64-bit node-v4.4.7-x64 如果上述软件已经安装的,跳过,没有安装的下载安装. 1,git下载安装(https://git ...