PAT1022. Digital Library (30)
两个坑。
一个是一直用的malloc不行了。因为malloc分配的是固定大小,之前做的题没遇到过是因为一般string都不长(malloc分配string为24个Byte),这次直接报段错误,呢们了半天。
第二个很无语,就是ID会有0,当int处理的时候把0消掉了,会有两个case不通过。
#include <iostream> #include <vector> #include <sstream> #include <stdio.h> #include <map> #include <algorithm> using namespace std; struct Book{ string id; string title; string author; vector<string> keyWords; string publish; int year; }; int n,m; string tmp; string line; vector<Book> bookSet; map<string,vector<int> > mmT; map<string,vector<int> > mmA; map<string,vector<int> > mmK; map<string,vector<int> > mmP; map<int,vector<int> > mmY; bool cmp(int a,int b){ return bookSet[a].id<bookSet[b].id; } int main() { cin>>n; for(int i=0;i<n;i++) { Book b; cin>>b.id; getline(cin,line);//cin没有读取回车 getline(cin,line);b.title=line;mmT[b.title].push_back(i); getline(cin,line);b.author=line;mmA[b.author].push_back(i); getline(cin,line); stringstream ss(line); while(ss>>tmp){ b.keyWords.push_back(tmp); mmK[tmp].push_back(i); } getline(cin,line);b.publish=line;mmP[b.publish].push_back(i); cin>>b.year;mmY[b.year].push_back(i); bookSet.push_back(b); } int queN; cin>>m; for(int i=0;i<m;i++) { scanf("%d: ",&queN); getline(cin,tmp); int yea; vector<int> logN; switch(queN){ case 1:logN=mmT[tmp];break; case 2:logN=mmA[tmp];break; case 3:logN=mmK[tmp];break; case 4:logN=mmP[tmp];break; case 5:yea=stoi(tmp);logN=mmY[yea];break; default:break; } printf("%d: ",queN);cout<<tmp<<endl; sort(logN.begin(),logN.end(),cmp); vector<int>::iterator ii=logN.begin(); while(ii!=logN.end()){ cout<<bookSet[(*ii)].id<<endl; ii++; } if(logN.size()==0){ cout<<"Not Found"<<endl; } } }