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;
}
}
}