トピック
へのリンク注:
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;
}