#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
#include<utility>
using namespace std;
multimap<string,string> m[5];
int main(){
int n;
cin>>n;
string waste;
getline(cin,waste);
for(int q=0;q<n;q++){
string id;
string title;
string author;
string keyword;
string publisher;
string year;
getline(cin,id);
getline(cin,title);
getline(cin,author);
getline(cin,keyword);
getline(cin,publisher);
getline(cin,year);
pair<string,string> p[4];
p[0].first=title;p[0].second=id;m[0].insert(p[0]);
p[1].first=author;p[1].second=id;m[1].insert(p[1]);
p[2].first=publisher;p[2].second=id;m[3].insert(p[2]);
p[3].first=year;p[3].second=id;m[4].insert(p[3]);
char* sss=(char*)keyword.c_str();
char* s=strtok(sss," ");
while(s!=NULL){
string str=s;
pair<string,string> pp;
pp.first=str;
pp.second=id;
m[2].insert(pp);
s=strtok(NULL," ");
}
}
int n1;
scanf("%d",&n1);
getline(cin,waste);
for(int i=0;i<n1;i++){
int num;
string s1;
getline(cin,s1);
num=s1[0]-'0';
cout<<s1<<endl;
s1=s1.substr(3,s1.length()-3);
multimap<string,string>::iterator it=m[num-1].find(s1);
if(it==m[num-1].end()){
printf("Not Found\n");
continue;
}
map<string,int> mm;
size_t n2=m[num-1].count(s1);
for(size_t j=0;j<n2;j++){
pair<string,int> ppp;
ppp.first=it->second;
ppp.second=0;
mm.insert(ppp);
it++;
}
for(auto it1=mm.begin();it1!=mm.end();it1++){
cout<<it1->first<<endl;
}
}
return 0;
}
总结:
考察对与stl容器的使用,主要使用了multimap,map容器,有些地方存在冗余,等二刷再精简。multimap键值可以重复,并且也会默认排序(按升序)。其中有用到strtok()函数,参考了链接: link此篇文章,当使用cin和scanf时,会使输入流停在空格或者换行前,再使用getline()函数会导致,多读入空格或读入一个空字符,所以可以在使用getline()读取下一个输入前,多用一次getline()把多余的空行读取掉,也可以用cin.ignore()函数。
string转char*链接: link