1022. Digital Library (30)PAT甲级

本文介绍了一个使用C++实现的简易论文检索系统。该系统通过解析输入的论文标题、作者、关键词等信息,并将其存储在不同的映射(map)中以便进行高效的查询。支持根据标题、作者、关键词、出版信息及年份等多种方式查询对应的论文ID。

传送门

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

using namespace std;


map<string,set<int> >mptitle,mpauthor,mpkeywords,mppub,mpyear;

void query(map<string,set<int> > &mp,const string &temp){
    if(mp.find(temp)==mp.end()) printf("Not Found\n");
    else{
        for(set<int>::iterator it=mp[temp].begin();it!=mp[temp].end();it++){
            printf("%07d\n",*it);
        }
    }
}

int main(){
    int n,id,m,type;
    string title,author,key,pub,year;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>id;
        getchar();
        getline(cin,title);
        mptitle[title].insert(id);
        getline(cin,author);
        mpauthor[author].insert(id);
        while(cin>>key){
            mpkeywords[key].insert(id);
            char c=getchar();
            if(c=='\n') break;
        }
        getline(cin,pub);
        mppub[pub].insert(id);
        getline(cin,year);
        mpyear[year].insert(id);
    }
    string temp;
    cin>>m;
    for(int i=0;i<m;i++){
        scanf("%d: ",&type);
        getline(cin,temp);
        cout<<type<<": "<<temp<<endl;
        if(type==1) query(mptitle,temp);
        else    if(type==2) query(mpauthor,temp);
        else    if(type==3) query(mpkeywords,temp);
        else    if(type==4) query(mppub,temp);
        else    query(mpyear,temp);
    }
}
### 关于 PAT 甲级真题 1172 的解析 PAT (Programming Ability Test) 是一项针对编程能力的测试,其中甲级难度较高,涉及算法设计与实现。以下是关于题目 **1172** 的相关内容。 #### 题目描述 根据已知的信息[^1]以及公开资源中的整理[^2],PAT 甲级真题 1172 被命名为《Digital Library》。该题目主要考察字符串处理、数据结构的应用以及输入输出优化等内容。具体要求如下: - 输入一系列书籍信息(包括书名、作者、关键词、出版社和出版年份),并按照指定条件查询匹配的结果。 - 查询方式分为五种: 1. 按照书名查找; 2. 按照作者查找; 3. 按照关键词查找; 4. 按照出版社查找; 5. 按照出版年份查找。 每本书籍最多被查找到一次,即使它满足多个查询条件。 --- #### 解决方案概述 为了高效解决此问题,可以采用以下方法: ##### 数据存储 定义一个 `Book` 类来表示一本书的主要属性,便于统一管理书籍信息。代码示例如下: ```cpp struct Book { int id; // 图书编号 string title; // 书名 string author; // 作者 vector<string> tags; // 关键词列表 string publisher; // 出版社 int year; // 出版年份 }; ``` ##### 处理逻辑 通过构建多关键字索引来加速查询操作。对于不同的查询类型,分别建立哈希表或其他快速检索的数据结构。例如: - 使用 `unordered_map<string, set<int>>` 存储按书名、作者、出版社等字段的映射关系。 - 对于关键词查询,则需遍历所有书籍逐一比较。 下面是完整的 C++ 实现代码片段: ```cpp #include <iostream> #include <vector> #include <string> #include <unordered_map> #include <set> using namespace std; // 定义图书结构体 struct Book { int id; string title; string author; vector<string> tags; string publisher; int year; }; int main() { int N, M; cin >> N; // 总共N本书 vector<Book> books(N); // 初始化书籍信息 for(int i=0;i<N;i++) { cin >> books[i].id >> books[i].title >> books[i].author >> books[i].tags.size(); // 假设先读取标签数量K books[i].tags.resize(books[i].tags.size()); for(auto &tag : books[i].tags){ cin >> tag; } cin >> books[i].publisher >> books[i].year; } cin >> M; // 查询次数M unordered_map<string, set<int>> titleMap, authorMap, pubMap; // 构建索引... } ``` 上述代码仅展示初始化部分,实际还需补充详细的索引创建及查询功能。 --- #### 注意事项 在开发过程中需要注意以下几个方面: - 输入规模较大时应考虑性能优化,比如减少不必要的字符串拷贝操作。 - 输出格式严格遵循样例说明,任何多余的空格或换行都会导致评测失败。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值