当前位置: 首页 > news >正文

PAT甲级(Advanced Level) Practice 1022 Digital Library

原题

1022 Digital Library - PAT (Advanced Level) Practice

题目大意

给定一本书的id、书名、作者、(多个)关键词、出版社、出版年份,根据输入的书名、作者、(其中一个)关键词、出版社、出版年份按大小顺序返回id

解题思路

先吐槽一句,题目简单是简单,麻烦是真麻烦...

利用哈希表来储存元素,由于可能多本书有相同的关键字,因此用vector<string>来储存答案的id。

另外,对于keywords,我们要额外进行空格分割,再分别将每一个关键词存入哈希表。

代码(c++)
#include <bits/stdc++.h>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 10010;

int n, m;
unordered_map<string, vector<string>> title_m;        // 书名哈希表
unordered_map<string, vector<string>> author_m;       // 作者哈希表
unordered_map<string, vector<string>> key_m;          // 关键词哈希表
unordered_map<string, vector<string>> publisher_m;    // 出版社哈希表
unordered_map<string, vector<string>> year_m;         // 年份哈希表

void split(string s, unordered_map<string, vector<string>> &m, string id) {  // 根据空格分割关键词
    int len = 0;
    for(int i = 0; i < s.size(); i++) {
        if(s[i] == ' ') {
            string str = s.substr(i - len, len);
            m[str].push_back(id);
            len = -1;                            // len为-1因为马上下面就要+1了
        }
        len++;
    }
    string str = s.substr(s.size() - len);
    m[str].push_back(id);
}

bool find_id(const string& search, const unordered_map<string, vector<string>>& m) {
    auto it = m.find(search); 
    if (it != m.end())                            // 找到,排序输出并返回true
        vector<string> res = it->second;  
        sort(res.begin(), res.end());
        for (string id : res) cout << id << endl;
        return true;                    
    }
    return false;
}

int main() {
    string sn;
    getline(cin, sn);                                    // 此处用getline读入,防止有其他空格
    n = atoi(sn.c_str());
    for(int i = 0; i < n; i++) {
        string id, title, author, key, publisher, year;
        getline(cin, id);
        getline(cin, title);
        getline(cin, author);
        getline(cin, key);
        getline(cin, publisher);
        getline(cin, year);
        title_m[title].push_back(id);
        author_m[author].push_back(id);
        publisher_m[publisher].push_back(id);
        split(key, key_m, id);
        year_m[year].push_back(id);
    }

    string sm;
    getline(cin, sm);
    m = atoi(sm.c_str());
    vector<string> ans;
    for (int i = 0; i < m; i++) {
        string search_id;
        getline(cin, search_id);
        cout << search_id << endl;
        string search = search_id.substr(3, search_id.size() - 3);  // 注意输入的search是带id的,先去掉
        if (find_id(search, title_m)) continue;
        if (find_id(search, author_m)) continue;
        if (find_id(search, key_m)) continue;
        if (find_id(search, publisher_m)) continue;
        if (find_id(search, year_m)) continue;
        cout << "Not Found" << endl;
    }
}

http://www.dtcms.com/a/73734.html

相关文章:

  • browser_use 自动化浏览器agent使用案例
  • 使用BLSTM自动评估句子级构音障碍的可理解性
  • checkpoint机制
  • IntelliJ IDEA 中 Maven 的 `pom.xml` 变灰带横线?一文详解解决方法
  • MyBatis-Plus防全表更新与删除插件BlockAttackInnerInterceptor
  • 第十六届蓝桥杯康复训练--4
  • Mysql的库操作
  • 全面解析 HTML 标签:简写与全称及其应用
  • 在Django模型中的Mysql安装
  • TCP/IP协议栈----通俗易懂(与OSI七层模型区别)
  • Qt介绍自定义插件四
  • 在 Unity 中判断 Xbox 手柄是否连接
  • 基于深度学习的皮肤癌智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
  • SSM框架——Spring面试题
  • 【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode
  • unreal engine5 mation warping使用,敌人受击后面向攻击者
  • 【MySQL基础-9】深入理解MySQL中的聚合函数
  • 解释 TypeScript 中的枚举(enum),如何使用枚举定义一组常量?
  • Blender材质 - 层权重
  • 使用unplugin-auto-import自动导入vue3的api,不需要在每一个.vue文件中重复去导入操作
  • 智慧园区综合运营平台建设方案,智慧园区规划方案(PPT)
  • LLM论文笔记 25: Chain-of-Thought Reasoning without Prompting
  • 【AI】深度学习与人工智能应用案例详解
  • 数据结构之栈
  • 《 C++ 点滴漫谈: 三十一 》函数重载不再复杂:C++ 高效调试与性能优化实战
  • SwanLab飞书通知插件:训练完成收到飞书消息,掌握训练进度更及时
  • 【工具】C#防沉迷进程监控工具使用手册
  • LIN接口
  • Spring源码解析
  • SpringBoot项目中JSON数据的存储与查询