PAT 甲级 1022 Digital Library

PAT 甲级 1022 Digital Library

注意最后两个测试点,会有0000001这样的数据,输出格式需要printf("%07d",id);。

另外还有几个输入的区别:
cin>>s; 会把开始的空白字符(包括换行符)从缓冲区中取出并丢弃,遇到非空白字符之后,再次遇到空白字符时,会把空白字符留在缓冲区,s中没有空白字符。
getline(cin,s); 会把换行符从缓冲区中取出并丢弃,也就是说s中没有换行符,缓冲区中也没有。
cin.get(); 会从缓冲区中读取一个字符。
具体参考CPP Reference。

所以:
(1)cin>>s;后面可以直接接cin>>s;,但不能直接接getline(cin,s);,需要中间加一个cin.get();,否则要么s是空string,要么s开始有空白字符。
(2)getline(cin,s);后面可以直接接cin>>s;。

#include <bits/stdc++.h>
using namespace std;
void Find(map<string,set<int>> &mp,const string &key,char type)
{
    printf("%c: %s\n",type,key.c_str());
    if(mp.find(key)==mp.end()) printf("Not Found\n");
    else{
        for(auto i:mp[key]) printf("%07d\n",i);
    }
}
int main() {
#ifdef LOCAL
    freopen("input.txt","r",stdin);
#endif
    map<string,set<int>> title_mp,author_mp,key_words_mp,publisher_mp,year_mp;
    int N;cin>>N;
    int id;string title,author,key_word,publisher,year;
    while(N--){
        cin>>id;cin.get();getline(cin,title);getline(cin,author);
        title_mp[title].insert(id);author_mp[author].insert(id);
        do{
            cin>>key_word;
            key_words_mp[key_word].insert(id);
        }while(cin.get()!='\n');
        getline(cin,publisher);getline(cin,year);
        publisher_mp[publisher].insert(id);year_mp[year].insert(id);
    }
    cin>>N;cin.get();char type;string key;
    while(N--){
        type=cin.get();cin.get();cin.get();getline(cin,key);
        switch (type)
        {
        case '1':
            Find(title_mp,key,type);
            break;
        case '2':
            Find(author_mp,key,type);
            break;
        case '3':
            Find(key_words_mp,key,type);
            break;
        case '4':
            Find(publisher_mp,key,type);
            break;
        case '5':
            Find(year_mp,key,type);
            break;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值