A1022

#include<iostream>
#include<vector>
#include <string>
#include <set>
using namespace std;
struct book{
	int ID;
	string title;
	string author;
	vector<string>key_word;
	string publisher,year;
};
int main(){
	int n,m,t_ID,temp,flag=0;
	string t_title,t_author,t_key,t_pub,content,t_year;
	cin>>n;
	vector<book>B(n);
	for(int i=0;i<n;i++){
		book b;
		cin>>t_ID;
		getchar();
		getline(cin,t_title);
		getline(cin,t_author);
		while(cin>>t_key){
            b.key_word.push_back(t_key);
             char c=getchar();
            if(c=='\n')
                break;
        }
        getline(cin,t_pub);
		cin>>t_year;
		b.ID=t_ID;
		b.title=t_title;
		b.author=t_author;
		b.publisher=t_pub;
		b.year=t_year;
		B.push_back(b);
	}
	cin>>m;
	set<int>S;
	for(int i=0;i<m;i++){
		scanf("%d: ",&temp);
		getline(cin,content);
		if(temp==1){
			for(int j=0;j<B.size();j++){
				if(B[j].title==content){
					S.insert(B[j].ID);
					flag=1;
				}
			
			}
		}
		if(temp==2){
			for(int j=0;j<B.size();j++){
				if(B[j].author==content){
					S.insert(B[j].ID);
					flag=1;
				}
			}
		}	
		if(temp==3){
			for(int j=0;j<B.size();j++){
				for(int k=0;k<B[j].key_word.size();k++)
				if(B[j].key_word[k]==content){
					S.insert(B[j].ID);
					flag=1;
				}
			}
		}	
		if(temp==4){
			for(int j=0;j<B.size();j++){
				if(B[j].publisher==content){
					S.insert(B[j].ID);
					flag=1;
				}			
			}
		}
		if(temp==5){
			for(int j=0;j<B.size();j++){
				if(B[j].year==content){
					S.insert(B[j].ID);
					flag=1;
				}
			}
		}
		if(flag==1){
			cout<<temp<<": "<<content<<endl;
			for(auto it=S.begin();it!=S.end();it++) printf("%07d\n",*it);
			
		}		
		
		else{
			cout<<temp<<": "<<content<<endl;
			cout<<"Not Found"<<endl;
		}
		S.clear();
		flag=0;
	}
	return 0;
}

  将有空格隔开的一个字符串分为数个字符串时可以用:

while(cin>>t_key){
            b.key_word.push_back(t_key);
             char c=getchar();
            if(c=='\n')
                break;
        }

  ==============在拿到此题的时候我感觉这题可以用map来做,但是还是觉得用结构体模拟要简单一点,下面我想用map试试

=======================================================================================================================

#include<iostream>
#include<vector>
#include <string>
#include <map>
#include <set>
using namespace std;
int main(){
	int ID,m,n,temp;
	string author,publisher,key,title,year,content;
	cin>>n;
	vector<multimap <string,int> >v(5);
	for(int i=0;i<n;i++){
		cin>>ID;
		getchar();
		getline(cin,title);
		getline(cin,author);
		while(cin>>key){
			v[2].insert(pair<string, int>(key, ID));
			char c=getchar();
			if(c=='\n') break;
		}
		getline(cin,publisher);
		getline(cin,year);
		v[0].insert(pair<string, int>(title, ID));
		v[1].insert(pair<string, int>(author, ID));
		v[3].insert(pair<string, int>(publisher, ID));
		v[4].insert(pair<string, int>(year, ID));
	}		
	cin>>m;
	set<int>S;
	for(int i=0;i<m;i++){
		scanf("%d: ",&temp);
		getline(cin,content);
		cout<<temp<<": "<<content<<endl;
		for(auto it=v[temp-1].begin();it!=v[temp-1].end();it++){
			if(it->first==content) 
			S.insert(it->second);
		}	
		if(!S.empty())
		for(auto it=S.begin();it!=S.end();it++) printf("%07d\n",*it);
		else cout<<"Not Found"<<endl;
		S.clear();
	} 
	return 0;
}

  经过测试后面两个测试点需要使用printf("%07d\n",*it);才能通过;

在使用map时没有注意到一个key这能对于一个value,导致每个测试只能输出一个查询结果,这是因为比如2011这个key可以对于1111111和222222,而后输入的容易将先输入的覆盖,这是我使用了

vector<multimap <string,int> >v(5);
仅仅是定义时不一样其他的完全一样


还有就是map的插入方式有点特殊
v[0].insert(pair<string, int>(title, ID));
这点要记牢,不然考试时容易翻车

posted on 2020-01-27 15:51  妄想症T  阅读(166)  评论(0编辑  收藏  举报

导航