这道题有一个需要注意的地方:题中所说的放回书时该书前面的书到底是什么。
答案是:现在有的那本排在他前面的书。
该题uva上有测试数据(瓢虫),可以参考~~
#include<cstdio>
#include<iostream>#include<cstring>
#include<map>
#include<string>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
map<string,string> p;
string s1[1000],s2[1000],ss[1000],s[1000],s3,s4;
int main(){
string buf;
int maxn=0,ans,a[1000];
while(getline(cin,buf)){
if(buf=="END")
break;
for(int i=1;i<buf.size();i++){
if(buf[i]=='"'){
ans=i;break;
}
}
for(int i=0;i<buf.size();i++){
if(ans>=i)
s1[maxn]+=buf[i];
if(i>ans+4)
s2[maxn]+=buf[i];
}
p[s1[maxn]]=s2[maxn];
maxn++;
}
memset(a,0,sizeof(a));
int kase=0,ens=0;
set<string> st;
for(int i=0;i<maxn;i++)
st.insert(s2[i]);
for(set<string>::iterator it=st.begin();it!=st.end();++it){
kase=0;
for(int i=0;i<maxn;i++){
if(s2[i]==*it)
ss[kase++]=s1[i];
}
sort(ss,ss+kase);
for(int i=0;i<kase;i++){
s[ens++]=ss[i];
a[ens-1]=1;
ss[i].clear();
}
}
while(getline(cin,buf)){
if(buf=="END")
break;
ans=0;
for(int i=0;i<buf.size();i++)
if(buf[i]=='"'){
ans=i;break;
}
for(int i=0;i<buf.size();i++){
if(i<ans-1)
s3+=buf[i];
if(i>=ans)
s4+=buf[i];
}
if(s3=="BORROW"){
for(int i=0;i<maxn;i++)
if(s[i]==s4){
a[i]=0;break;
}
}
if(s3=="RETURN"){
for(int i=0;i<maxn;i++)
if(s[i]==s4){
a[i]=2;break;
}
}
if(buf=="SHELVE"){
for(int i=0;i<maxn;i++){
if(a[i]==2){
cout<<"Put "<<s[i];
int bbs=0;
for(int j=i-1;j>=0;j--)
if(a[j]==1){
cout<<" after "<<s[j]<<'\n';
bbs=1;break;
}
if(bbs==0)
cout<<" first"<<'\n';
a[i]=1;
}
}
printf("END\n");
}
s3.clear();s4.clear();
}
return 0;
}