1 #include<stdio.h> 2 #include<string.h> 3 #include<map> 4 #include<string> 5 #include<set> 6 #include<iostream> 7 using namespace std; 8 int n; //n本书 9 //标题、作者、关键字、出版社、出版年份与ID的映射 10 map<string,set<int>> mpTITLE,mpAUTHOR,mpKEY,mpPUBLISHER,mpYEAR; 11 12 void query(map<string,set<int>> &m,string Q) //【skill】“&m”的引用符号是为了加快处理速度 13 { 14 if(m.find(Q)==m.end()) 15 printf("Not Found "); 16 else 17 for(set<int>::iterator it=m[Q].begin() ; it!=m[Q].end() ; ++it) //【思维】m已经选好了是作者还是出版社之类的,it只要扫描这个类的set,按个输出就可以了 18 printf("%d ",*it); //【skill】it所指向的内容 19 } 20 21 int main() 22 { 23 scanf("%d",&n); 24 int ID=-1; 25 string title,author,key,publisher,year; 26 for(int i=0 ; i<n ; ++i) 27 { 28 scanf("%d",&ID); 29 char c=getchar(); //【caution】吸收换行符 30 getline(cin,title); //输入标题 31 mpTITLE[title].insert(ID); 32 getline(cin,author); 33 mpAUTHOR[author].insert(ID); 34 while(cin>>key) //【skill】持续输入关键字的方法,cin也是按空格划分的 35 { 36 mpKEY[key].insert(ID); 37 char d=getchar(); //【skill】取后面的字符,是空格,则还有key,是“ 则输入结束,break” 38 if(d==' ') 39 break; 40 } 41 getline(cin,publisher); 42 mpPUBLISHER[publisher].insert(ID); 43 getline(cin,year); 44 mpYEAR[year].insert(ID); 45 } 46 int q,num; 47 scanf("%d",&q); 48 for(int i=0 ; i<q ; ++i) 49 { 50 scanf("%d: ",&num); //看看这样可否 51 string Q; 52 getline(cin,Q); 53 printf("%d: %s ",num,Q.c_str()); //【skill】将Q转为可用printf输出的%s 54 if(1==num) 55 query(mpTITLE,Q); 56 else if(2==num) 57 query(mpAUTHOR,Q); 58 else if(3==num) 59 query(mpKEY,Q); 60 else if(4==num) 61 query(mpPUBLISHER,Q); 62 else if(5==num) 63 query(mpYEAR,Q); 64 65 66 } 67 return 0; 68 }