代码:
//xiaoyang111 表示没有
#include <iostream>
#include <unordered_map>
#define int long long
using namespace std;
signed main(){
int n;
cin >> n;
unordered_map<string,string> l,r;//类似链表
unordered_map<string,bool> flag;
string tail="xiaoyang111",head="xiaoyang111";//空
string play1="xiaoyang111",play2="xiaoyang111";//空
for (int _=0;_<n;++_){
string op;
cin >> op;
l["xiaoyang111"]="xiaoyang111",r["xiaoyang111"]="xiaoyang111";//空
if (op=="start"){
if (play1!="xiaoyang111"){//可疑
//放在最后面
l[play1]=tail,r[play1]="xiaoyang111";//链
r[tail]=play1;//链
flag[play1]=true;//记
tail=play1;//移
if (head=="xiaoyang111"){//如果那个时候队列是空的
head=play1;//放
}
if (play2!="xiaoyang111"){
l[play2]=tail,r[play2]="xiaoyang111";
r[tail]=play2;
flag[play2]=true;
tail=play2;
}
}
l["xiaoyang111"]="xiaoyang111",r["xiaoyang111"]="xiaoyang111";//空
play1=head;
play2=r[head];
if (play1=="xiaoyang111"){//如果是空的
head=tail=play1;//头和尾是空的
cout<<"Error\n";
continue;
}
cout<<play1<<" ";
if (play2=="xiaoyang111"){
head=play2;//因为play1上去了
cout<<endl;
continue;
}
head=r[play2];//转移头
cout<<play2<<endl;
}else if (op=="arrive"){//可疑
string x;
cin >> x;
if (flag[x] || x==play1 || x==play2){//如果有问题
cout<<"Error\n";
continue;
}
cout<<"OK\n";
l[x]=tail,r[x]="xiaoyang111";//链上
r[tail]=x;//链上
tail=x;//移
flag[x]=true;//标记
if (head=="xiaoyang111"){//如果一个人没有但是加进来了
head=x;
l[head]="xiaoyang111",r[head]="xiaoyang111";
}
}else if (op=="leave"){//没问题了
string x;
cin >> x;
if (!flag[x] || x==play1 || x==play2){
cout<<"Error\n";
continue;
}
cout<<"OK\n";
flag[x]=false;//标记
string left=l[x],right=r[x];//左右
if (head==x){//如果把头给删了
head=right;
l[head]="xiaoyang111";
}
r[left]=right,l[right]=left;//链
if (tail==x){//如果把尾巴给删了
tail=left;
r[tail]="xiaoyang111";
}
l[x]="xiaoyang111",r[x]="xiaoyang111";//xiaoyang111 表示空
}
}
return 0;
}
unordered_map 的 l 表示这个人左边的人是谁,r 表示这个人右边人是谁,字符串 xiaoyang111 表示没有人,变量 head 表示头是谁,tail 是尾巴是谁,同样的,如果队列为空,head 和 tail 均为 xiaoyang111。