题目如下:

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)-map映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. PAT 甲级 1022 Digital Library (30 分)(字符串读入getline,istringstream,测试点2时间坑点)

    1022 Digital Library (30 分)   A Digital Library contains millions of books, stored according to thei ...

  3. pat 甲级 1022. Digital Library (30)

    1022. Digital Library (30) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A Di ...

  4. 1022 Digital Library (30 分)

    1022 Digital Library (30 分)   A Digital Library contains millions of books, stored according to thei ...

  5. 1022 Digital Library (30)(30 分)

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

  6. PAT-1022 Digital Library (30 分) 字符串处理

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

  7. 1022 Digital Library (30)(30 point(s))

    problem A Digital Library contains millions of books, stored according to their titles, authors, key ...

  8. 1022. Digital Library (30)

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

  9. PAT Advanced 1022 Digital Library (30 分)

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

随机推荐

  1. eclipse的maven操作无反应

    第一 查eclipse能不能正常用 hi world.java 第二 查maven能不能正常用 cmd: mvn -v 第三 看看maven和eclipse是不是64位之类的 第四 maven和ecl ...

  2. node之子线程child_process模块

    node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,用于新建子进程,子进程的 ...

  3. Python小代码_12_生成前 n 行杨辉三角

    def demo(t): print([1]) print([1, 1]) line = [1, 1] for i in range(2, t): r = [] for j in range(0, l ...

  4. JMeter如何和Charles进行接口测试

    什么是接口测试,接口测试到底如何开展,我相信任何一个软件测试人员都会有这样的疑问, 这里我以接口测试自动化平台的登录接口进行讲解. 一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测 ...

  5. JavaScript正则表达式模式匹配(1)——基本字符匹配

    var pattern=/g..gle/; //点符号表示匹配除了换行符外的任意字符 var str='g78gle'; alert(pattern.test(str)); var pattern=/ ...

  6. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

  7. Dockerfile的指令

    指令的一般格式为 INSTRUCTION arguments,指令包括 FROM.MAINTAINER.RUN 等. FROM 格式为 FROM <image>或FROM <imag ...

  8. ZooKeeper之(五)集群管理

    在一台机器上运营一个ZooKeeper实例,称之为单机(Standalone)模式.单机模式有个致命的缺陷,一旦唯一的实例挂了,依赖ZooKeeper的应用全得完蛋. 实际应用当中,一般都是采用集群模 ...

  9. Dynamics CRM2016 WebApi查询之alternate key

    本篇继续来分享web api查询中的一条,利用alternate key进行查询. alternate key是个什么东西这里就不解释了如果有不知道的可以去看sdk.这里以房号信息实体为例,新建一个键 ...

  10. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...