PAT甲题题解-1022. Digital Library (30)-map映射+vector
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/6789235.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~
题意:
给出n本书的id、名称、作者、多个关键词、出版社、出版年
然后给出m个查询,每个查询包含查询的种类、对应的内容
针对每个查询,让你输出所有符合的书的id,从小到大排序,没有的话则输出No Found
首先把每个book的信息都读取处理好,然后按照id排个序,因为最后查询需要按照id的增序输出
重新遍历所有的book,对于book的每个信息string,通过build_map()建立一下映射
由于有5种类别,所以分开建立映射maps[1]~maps[5]
(因为可能会存在不同类别会出现相同的string)
这样就把每种类型的string和vector数组book_id的索引值建立起来,vector数组存储对应的book id
由于最多有10000个书,那么就至少有10000个title和10000个auther
题目中还说了最多1000个不同的keywords和1000个不同的publisher
year的范围是1000~3000,则最多有2000个
所以映射值最多为24000个,即vector的数组大小要>24000,否则会出现段错误越界
然后对于查询的种类k和字符串string
找出映射值maps[k][string],如果为0,则说明找不到,输出No Found
如果为某个值idx,那么访问vector数组book_id[idx],存储的即是对应书的id
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <vector>
#define TITLE 1
#define AUTHER 2
#define KEYWORDS 3
#define PUBLISHER 4
#define YEAR 5
using namespace std;
const int maxn=+;
int n;
int cnt=;
map<string,int>maps[]; struct Book{
int id;
string title;
string author;
string keywords[];
int keynum;
string publisher;
string year;
bool operator<(const Book tmp)const{
return id<tmp.id;
}
}book[maxn]; vector<int> book_id[maxn*]; void readKeywords(char*str,int i){
//按照定义的分隔符d来分割字符串,对keyword进行读取
const char *d = " ";//空格
char *p;
p = strtok(str,d);
int idx=;
//这样做的主要原因是避免最后输出换行
while(p)
{
book[i].keywords[idx]=p;
idx++;
p=strtok(NULL,d); //读取下一个p
}
book[i].keynum=idx;
}
/**
建立k、string的映射
*/
void build_map(string s,int i,int k){
if(maps[k][s]==)
maps[k][s]=++cnt;
book_id[maps[k][s]].push_back(i);
}
int main()
{
char str[];
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&book[i].id);
getchar(); //这里是读取id后面的换行符
gets(str);
book[i].title=str; gets(str);
book[i].author=str; gets(str);
readKeywords(str,i); gets(str);
book[i].publisher=str; gets(str);
book[i].year=str;
}
sort(book,book+n);
//建立映射,顺便存储书的id
for(int i=;i<n;i++){
build_map(book[i].title,i,TITLE);
build_map(book[i].author,i,AUTHER);
for(int j=;j<book[i].keynum;j++)
build_map(book[i].keywords[j],i,KEYWORDS);
build_map(book[i].publisher,i,PUBLISHER);
build_map(book[i].year,i,YEAR);
}
int m;
int kind;
scanf("%d",&m);
for(int i=;i<m;i++){
scanf("%d:",&kind);
getchar();
gets(str);
printf("%d: %s\n",kind,str);
string s=str;
int map_id=maps[kind][s];
if(map_id==)
printf("Not Found\n");
else{
for(int j=;j<book_id[map_id].size();j++){
int bid=book_id[map_id][j];
printf("%07d\n",book[bid].id);
}
}
}
return ;
}
PAT甲题题解-1022. Digital Library (30)-map映射+vector的更多相关文章
- 1022. Digital Library (30) -map -字符串处理
题目如下: A Digital Library contains millions of books, stored according to their titles, authors, key w ...
- PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径
模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...
- PAT甲题题解-1103. Integer Factorization (30)-(dfs)
该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...
- PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs
统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> # ...
- PAT甲题题解-1072. Gas Station (30)-dijkstra最短路
题意:从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内.如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个.如果平 ...
- PAT甲题题解-1091. Acute Stroke (30)-BFS
题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写 ...
- PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)
题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...
- pat 甲级 1022. Digital Library (30)
1022. Digital Library (30) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A Di ...
- PAT 甲级 1022 Digital Library (30 分)(字符串读入getline,istringstream,测试点2时间坑点)
1022 Digital Library (30 分) A Digital Library contains millions of books, stored according to thei ...
随机推荐
- October 10th 2017 Week 41st Tuesday
If you focus on what you left behind you will never see what lies ahead. 如果你只顾回头看,那么你永远也看不见前方有什么. Ye ...
- spark-机器学习实践-K近邻应用实践一
K近邻应用-异常检测应用 原理: 根据数据样本进行KMeans机器学习模型的建立,获取簇心点,以簇为单位,离簇心最远的第五个点的距离为阈值,大于这个值的为异常点,即获得数据异常. 如图:
- Android学习之——自己搭建Http框架(1)
一.前言 近期学习http框架. 眼下写的这个框架临时仅仅适用于学习之用,实际用于项目之中还须要不断的优化. 要从server或者网络获取数据.显示到U ...
- Spring IOC 之 SmartInitializingSingleton
使用 实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated. 主要应用场合就是在所有单例 bean 创建完成之后,可以 ...
- ocr jdk
公司有个需求,遍历所有图片,筛选出含有敏感字的图片.这里就需要ocr技术,找了几天,发现了几个不错的ocr jdk. http://cn.ocrsdk.com/ 俄罗斯公司,贵有贵的道理 http:/ ...
- [转]深入理解MFC中程序框架
最近抽空复习了一下MFC的内容,觉得一篇博文写的不错. 原文内容太多直接给出链接吧:深入理解MFC中程序框架 链接2:深入浅出话VC++(2)——MFC的本质 链接3:MFC单文档/视图结构穷追猛打
- 面试题之O(n)内旋转字符串
样例: 字符串“abcd1234"左移3位结果为”234abcd1“ K:左移位数 L:字符串长度 方案1:暴力 O(K * L) 可以每次将数组中的元素左移一位,循环K次. abcd123 ...
- bundle install 安装的 gem 提示 cannot load such file
/usr/local/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load ...
- Django Rest Framework源码剖析(八)-----视图与路由
一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...
- TPM及TSS协议栈的安装使用
TPM及TSS协议栈的安装 标签: 可信计算. 目录 安装环境介绍 TPM及TSS安装 软件包下载 TPM 安装 安装TSS 安装tpm-tools 交互过程 编写代码测试TPM是否可用 编写代码测试 ...