PAT A1022 Digital Library

news/2024/7/5 5:34:41

1022 Digital Library

分数 30

作者 CHEN, Yue

单位 浙江大学

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 (≤104) 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

  

* 由于题目的输出由查询编号决定,那么就可以将每个查询编号对应的信息用一个map容器
 * 存储,map的第一个值的类型为string,存储每个序号对应的信息(书名,作者,...)的
 * 字符串,但是输入的关键词要将其拆分成单词存储,因为查询的关键词是以单词进行查询的;
 * map的第二个值得类型为set<string>,存储每个信息所对应的书的编号,由于set是自动升序
 * 排序的,这也正符合题目的要求;
 *

 * 最后要注意查询时的输入,我开始用的是两个string来进行输入,即:
 *  string op, t;
 *  cin >> op;
 *  getline(cin, t);
 *  但要注意此时的t是连中间的那个空格也一起读入的,中间用getchar()来吸收掉那个空格应该是
 *  可以的;
 *
 *  其实完全可以直接这样写,更加便捷
 *  getline(cin, op);
    t = op.substr(3);
    
    map就是一个二维数组,当然可以这么写了:
    for(auto &a : mp[d][t]) mp是定义的一个数组,相当于此时的mp是三维数组
        cout << a << endl;

/**
 * 由于题目的输出由查询编号决定,那么就可以将每个查询编号对应的信息用一个map容器
 * 存储,map的第一个值的类型为string,存储每个序号对应的信息(书名,作者,...)的
 * 字符串,但是输入的关键词要将其拆分成单词存储,因为查询的关键词是以单词进行查询的;
 * map的第二个值得类型为set<string>,存储每个信息所对应的书的编号,由于set是自动升序
 * 排序的,这也正符合题目的要求;
 * 
 * 最后要注意查询时的输入,我开始用的是两个string来进行输入,即:
 *  string op, t;
 *  cin >> op;
 *  getline(cin, t);
 *  但要注意此时的t是连中间的那个空格也一起读入的,中间用getchar()来吸收掉那个空格应该是
 *  可以的;
 * 
 *  其实完全可以直接这样写,更加便捷
 *  getline(cin, op);
    t = op.substr(3);
    
    map就是一个二维数组,当然可以这么写了:
    for(auto &a : mp[d][t]) mp是定义的一个数组,相当于此时的mp是三维数组
        cout << a << endl;
*/

#include <iostream>
#include <map>
#include <set>
#include <string>

using namespace std;

map<string, set<string> > mp[6];

void Read()
{
    int n;
    cin >> n;
    getchar();  //吸收掉换行符必不可少
    string s[7];
    
    for(int i=0; i<n; ++i)
    {
        for(int j=0; j<6; ++j)
        {
            getline(cin, s[j]);
            if(j > 0 && j != 3) //第四个字符串需要特别处理一下,将其分解成单词
                mp[j][s[j]].insert(s[0]);
        }
        
        //第四个字符串需要特别处理一下,将其分解成单词
        int idx = 0;
        while(idx < s[3].size())
        {
            int len = 0, sta = idx;
            while(idx < s[3].size() && s[3][idx] != ' ')
                ++len , ++idx;
            string t = s[3].substr(sta, len);
            mp[3][t].insert(s[0]);
            ++idx;
        }
    }
    
    int m;
    cin >> m;
    getchar(); //吸收掉换行符
    
    string op, t;
    while (m -- )
    {
        getline(cin, op);
        t = op.substr(3);
        cout << op << endl;
        int d = op[0] - '0';
        /**
        scanf("%s ",op); //要这么写就需要将op改为字符数组
        getline(cin, t);
        int d = op[0] - '0';
        cout << op << ' ' << t << endl;
        */
        
        if(mp[d].find(t) == mp[d].end())
            puts("Not Found");
        else
        {
            for(auto &a : mp[d][t])
                cout << a << endl;
        }
            
    }
}

int main()
{
    Read();
    
    return 0;
}


http://lihuaxi.xjx100.cn/news/1089841.html

相关文章

关于海康工业相机连接电脑时出现链接速度低于1Ggps解决办法

一、电脑端网卡配置 打开电脑设置——网络和Internet——高级网络设置——更改适配器选项——双击以太网 网络和Internet点击属性、打开配置 点击配置 点击高级 巨型帧9KB 连接速度和双工模式_1.0Gbps全双工 电源管理取消勾选 二、MVS相机软件参数设置 将相机连接至电脑 打开…

异构无线传感器网络路由算法研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​无线传感器网络(Wireless Sensor Networks, WSN)是一种新型的融合传感器、计算机、通信等多学科的信息获取和处理技术的网络,…

存储资源调优技术——智能缓存分区

SmartPratition智能缓存分区 基本概念 本质上就是一种Cache分区技术 通过对系统核心资源的分区&#xff08;隔离不同业务所需要的缓存资源&#xff09;&#xff0c;保证关键应用的性能 工作原理 用户可以以LUN或文件系统为单位设置SmartPartition分区 每个SmartPartition分区的…

改进YOLOv5: | 涨点神器 | 即插即用| ICLR 2022!Intel提出ODConv:即插即用的动态卷积

OMNI-DIMENSIONAL DYNAMIC CONVOLUTION ODConv实验核心代码ODConv代码yaml文件运行:论文链接: https://openreview.net/forum?id=DmpCfq6Mg39 本文介绍了一篇动态卷积的工作:ODConv,其通过并行策略采用多维注意力机制沿核空间的四个维度学习互补性注意力。作为一种“即插…

《用于准确连续非侵入性血压监测的心跳内生物标志物》阅读笔记

目录 0 基础知识 1 论文摘要 2 论文十问 3 实验结果 4 论文亮点与不足之处 5 与其他研究的比较 6 实际应用与影响 7 个人思考与启示 参考文献 0 基础知识 非侵入性是指在进行医学检查或治疗时&#xff0c;不需要切开皮肤或穿刺体内组织&#xff0c;而是通过外部手段进…

C语言-学习之路-03

C语言-学习之路-03 程序流程结构选择结构if语句if...else...语句三目运算符switch语句 循环结构while语句do...while语句for语句嵌套循环 跳转语句break、continue、gotobreak语句continue语句goto语句 程序流程结构 C语言支持最基本的三种程序流程结构&#xff1a;顺序结构、…

【Linux】文件与路径

一、Linux相关软件 xftp&#xff1a;用来传文件 xshell&#xff1a;用来敲命令 二、Linux的文件结构 windows系统下设有盘符&#xff1a;如C盘、D盘等&#xff0c;Linux没有盘符的概念&#xff0c;只有一个根目录/&#xff0c;所有文件都在它下面。 在根目录下输入命令ls&am…

Linux运维:makefile

一.makefile 1.makefile介绍 Makefile 是一种用于自动化构建的文件&#xff0c;它描述了一个软件项目的编译规则和依赖关系&#xff0c;并提供了一些工具来自动执行这些规则。 Makefile 的主要作用如下&#xff1a; 自动化编译&#xff1a;通过 Makefile&#xff0c;可以定…