前言

传送门

正文


参考题解一:
暴力解法

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
/* 题意:给出n本书的id,书名等相关信息,随后进行m次查询,每次查询按照 相应的查询条件查询所有满足该条件的书本,并按照它们的id进行升序排序 思路: 1、首先用结构体数组对所有书籍进行存储并按照id进行升序排序 2、进行m次查询,每次遍历书本,将对应满足条件的书籍的id输出 */
const int N=1e4+10;
struct Book{
	string id;
	string title;
	string author;
	string keys;
	string publisher;
	string year;
}books[N]; 
bool cmp(Book a,Book b){
	return a.id<b.id;
}
int n,m;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	char ch;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>books[i].id;
		cin.get(ch);//读取换行
		getline(cin,books[i].title);
		getline(cin,books[i].author);
		getline(cin,books[i].keys);
		getline(cin,books[i].publisher); 
		cin>>books[i].year;
	}
	sort(books,books+n,cmp);
	cin>>m;
	cin.get(ch);
	string temp,tt;
	char flag;
	for(int i=0;i<m;i++){
		getline(cin,temp);
		tt=temp.substr(3);
		flag=temp[0];
		cout<<temp<<endl;
		switch(flag){
			case '1':{
				int j=-1;
				for(int i=0;i<n;i++){
					if(books[i].title==tt){
						cout<<books[i].id<<endl;
						j=i;
					}
				}
				if(j==-1)cout<<"Not Found"<<endl;
				break;
			}
			case '2':{
				int j=-1;
				for(int i=0;i<n;i++){
					if(books[i].author==tt){
						cout<<books[i].id<<endl;
						j=i;
					}
				}
				if(j==-1)cout<<"Not Found"<<endl;
				break;
			}
				
			case '3':{
				int j=-1;
				for(int i=0;i<n;i++){
					if(books[i].keys.find(tt)!=string::npos){
						cout<<books[i].id<<endl;
						j=i;
					}
				}
				if(j==-1)cout<<"Not Found"<<endl;
				break;
			}
			case '4':{
				int j=-1;
				for(int i=0;i<n;i++){
					if(books[i].publisher==tt){
						cout<<books[i].id<<endl;
						j=i;
					}
				}
				if(j==-1)cout<<"Not Found"<<endl;
				break;
			}
			case '5':{
				int j=-1;
				for(int i=0;i<n;i++){
					if(books[i].year==tt){
						cout<<books[i].id<<endl;
						j=i;
					}
				}
				if(j==-1)cout<<"Not Found"<<endl;
				break;
			}
				
			default:
					break;
		}

	}
	return 0;
} 

参考题解二: