PAT (Advanced Level) 1022. Digital Library (30)
简单模拟题。
写的时候注意一些小优化,小心TLE。
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> #include<queue> #include<vector> using namespace std; struct X { string id; char title[90]; int Title; char author[90]; int Author; vector<int>key; char publisher[90]; int Publisher; int year; }s[10000+10]; int n,m; map<string,int>Tit,Aut,Key,Pub; vector<string>ans; int tot_Tit=0,tot_Aut=0,tot_Key=0,tot_Pub=0; bool cmp(const X&a,const X&b) { return a.id<b.id; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>s[i].id; getchar(); gets(s[i].title); if(Tit[s[i].title]==0) Tit[s[i].title]=++tot_Tit; s[i].Title=Tit[s[i].title]; gets(s[i].author); if(Aut[s[i].author]==0) Aut[s[i].author]=++tot_Aut; s[i].Author=Aut[s[i].author]; char tmp[1000]; gets(tmp); int len=strlen(tmp); string q; for(int j=0;j<=len;j++) { if(tmp[j]==' '||tmp[j]=='\0') { if(Key[q]==0) Key[q]=++tot_Key; s[i].key.push_back(Key[q]); q.clear(); } else q=q+tmp[j]; } gets(s[i].publisher); if(Pub[s[i].publisher]==0) Pub[s[i].publisher]=++tot_Pub; s[i].Publisher=Pub[s[i].publisher]; scanf("%d",&s[i].year); } sort(s+1,s+1+n,cmp); scanf("%d",&m); for(int i=1;i<=m;i++) { char op[5]; scanf("%s",op); getchar(); char h[100]; gets(h); printf("%s %s\n",op,h); if(op[0]=='1') { int num=Tit[h]; for(int i=1;i<=n;i++) if(s[i].Title==num) ans.push_back(s[i].id); } else if(op[0]=='2') { int num=Aut[h]; for(int i=1;i<=n;i++) if(s[i].Author==num) ans.push_back(s[i].id); } else if(op[0]=='3') { int num=Key[h]; for(int i=1;i<=n;i++) { for(int j=0;j<s[i].key.size();j++) { if(s[i].key[j]==num) { ans.push_back(s[i].id); break; } } } } else if(op[0]=='4') { int num=Pub[h]; for(int i=1;i<=n;i++) if(s[i].Publisher==num) ans.push_back(s[i].id); } else if(op[0]=='5') { int num=0; for(int i=0;h[i];i++) num=num*10+h[i]-'0'; for(int i=1;i<=n;i++) if(s[i].year==num) ans.push_back(s[i].id); } if(ans.size()==0) printf("Not Found\n"); else { for(int i=0;i<ans.size();i++) cout<<ans[i]<<endl; ans.clear(); } } return 0; }