PAT A1022 Digital Library (30point(s))

题目链接
注意点:
1.要用到map<string,set>来将学号映射到不同的字符串信息上方便查找。
2.关键字的提取要注意区分空格和换行,只有遇到换行才说明关键字部分结束。可以用getchar()来判断,代码如下:

do{//关键字要特殊处理
            cin>>key;//读入一个关键字
            mpkeywords[key].insert(id);//把id加入到key对应的集合中
        }while(getchar()!='\n');//只要不遇到换行符就说明还有关键字

3.把查询用一个函数完成的话,要注意对映射和字符串加引用,否则仅靠参数拷贝传递速度很慢,最后一个样例会超时。
4.输入id后要用getchar()吸收换行符,其余的带空格的信息一律用getline()来输入。

#include<cstdio>
#include<map>
#include<string>
#include<iostream>
#include<set>
using namespace std;
map<string,set<int> > mptitle,mpauthor,mpkeywords,mppublisher,mpyear;//
string title,author,key,publisher,year;
void check(map<string,set<int> >& mp,string& query){
    //查询函数,为省时要使用引用
    if(mp[query].size()){//有对应的学号
            for(set<int>::iterator it=mp[query].begin();it!=mp[query].end();it++){
                printf("%07d\n",*it);//输出固定位数的号码不够的位也要用0补齐
            }
        }
        else cout<<"Not Found"<<endl;
}
int main(){
    int n,m;
    scanf("%d",&n);//书本数
    for(int i=0;i<n;i++){//信息录入
        int id;
        string info;
        scanf("%d",&id);
        char c=getchar();//接受掉学号一行的换行
        getline(cin,title);//书名
        mptitle[title].insert(id);//把id加入到title对应的集合中
        getline(cin,author);//作者名
        mpauthor[author].insert(id);//把id加入到author对应的集合中
        do{//关键字要特殊处理
            cin>>key;//读入一个关键字
            mpkeywords[key].insert(id);//把id加入到key对应的集合中
        }while(getchar()!='\n');//只要不遇到换行符就说明还有关键字
        getline(cin,publisher);//出版商
        mppublisher[publisher].insert(id);//将id加入到publisher对应的集合中
        getline(cin,year);//年份
        mpyear[year].insert(id);//将id加入到year对应的集合中
    }
    scanf("%d",&m);//查询数
    for(int i=0;i<m;i++){
        int querynum;//查询类型
        string query;//查询信息
        scanf("%d: ",&querynum);
        getline(cin,query);
        cout<<querynum<<": "<<query<<endl;
    if(querynum==1) check(mptitle,query);
    //不同的查询类型对应不同的映射
    else if(querynum==2) check(mpauthor,query);
    else if(querynum==3) check(mpkeywords,query);
    else if(querynum==4) check(mppublisher,query);
    else check(mpyear,query);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值