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));
这点要记牢,不然考试时容易翻车
浙公网安备 33010602011771号