#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
typedef pair<string,string>Pll;
map<Pll,string>M;
map<string,Pll>M2;
set<Pll>S;
int main()
{
//freopen("in.txt","r",stdin);
string s,s1,s2;
int a;
while(getline(cin,s)){
if(s[0]=='E') break;
a=s.find('"',1);
s1=s.substr(0,a+1);
s2=s.substr(a+5);
Pll p = make_pair(s2,s1);
M[p] = s1;
M2[s1] = p;
//cout<<"在end之前的字符串截取之后为"<<s<<"\n";
}
K:while(getline(cin,s)){
//cout<<"从end之后的字符串截取之后为"<<s<<"\n";
if (s[0] == 'B'){
s1 = s.substr(7);
Pll x = M2[s1];
M.erase(x);
}
if(s[0] == 'R'){
s1 = s.substr(7);
Pll x = M2[s1];
S.insert(x);
}
if(s[0]=='S'){
while(S.size()!=0){
set<Pll>::iterator it = S.begin();
Pll x = *it;
M[*it]=(*it).second;
map<Pll,string>::iterator Key = M.find(*it);
if(Key==M.begin()){
cout<<"Put "<<(*it).second<<" first\n";
S.erase(it);
}else{
cout<<"Put "<<(*Key).second<<" after ";
Key--;
cout<<(*Key).second<<"\n";
S.erase(it);
}
}
cout<<"END"<<"\n";
}
if(s[0]=='E'){
return 0;
}
}
return 0;
}
思想:
创造一个map<Pll,string>M,一个set<Pll>S,一个map<string,Pll>M2。首先存储字符串时,以by为准分开成两个字符串,
作者在前,标题在后存储入M;以<string,Pll>存入M2;
当出现E时,终止存储
当出现B时,通过M2找到相应的Pll。int &ad=find(string);if(ad!=M.end()) M.erase(ad);
当出现R时,先将string存储入set
当出现S时,通过M2找到相应的Pll。再使得M[Pll]=string。再通过判断M.find(string)!=0 输出;
当出现end时结束。