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;
		}
		
	}

}

 

posted @ 2016-03-24 23:38  Yellowman  阅读(232)  评论(0编辑  收藏  举报
TVRBMExqRXlPQzR5TXpjdU1UVTEK\n