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\n");
16 else
17 for(set<int>::iterator it=m[Q].begin() ; it!=m[Q].end() ; ++it) //【思维】m已经选好了是作者还是出版社之类的,it只要扫描这个类的set,按个输出就可以了
18 printf("%d\n",*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,是“\n则输入结束,break”
38 if(d=='\n')
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\n",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 }