#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==' ') 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 ",*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==' ') 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==' ') 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 ",*it); else cout<<"Not Found"<<endl; S.clear(); } return 0; }
经过测试后面两个测试点需要使用printf("%07d ",*it);才能通过;
在使用map时没有注意到一个key这能对于一个value,导致每个测试只能输出一个查询结果,这是因为比如2011这个key可以对于1111111和222222,而后输入的容易将先输入的覆盖,这是我使用了
vector<multimap <string,int> >v(5);
仅仅是定义时不一样其他的完全一样
还有就是map的插入方式有点特殊
v[0].insert(pair<string, int>(title, ID));
这点要记牢,不然考试时容易翻车