用的stl的map,排序主要靠key.
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <map>
#include <string>
using namespace std;
map<string,int>sToNum;
struct state
{
string name;
int v;
bool operator<(const state &rhs)const{
return v>rhs.v||(v==rhs.v&&name<rhs.name);
}
};
map<state,int>list;
int opn;
char buf1[20],buf2[80];
int main(){
while (scanf("%d",&opn)==1){
sToNum.clear();
list.clear();
int maxv=1,id=1;
while (opn--){
scanf("%s",buf1);
if(!strcmp(buf1,"new")){
scanf("%s",buf2);
sToNum[string(buf2)]=maxv++;
state t;
t.name=buf2;
t.v=maxv-1;
list[t]=1;
}else if(!strcmp(buf1,"reply")){
scanf("%s",buf2);
state t;
t.v=sToNum[buf2];
t.name=buf2;
map<state,int>::iterator it=list.find(t);
t=it->first;
list.erase(it);
t.v=maxv++;
sToNum[buf2]=t.v;
list[t]=1;
}else if(!strcmp(buf1,"tag")){
scanf("%s",buf2);
state t;
t.v=sToNum[buf2];
t.name=buf2;
map<state,int>::iterator it=list.find(t);
t=it->first;
list.erase(it);
t.v=0;
sToNum[buf2]=0;
list[t]=1;
}else{
map<state,int>::iterator it=list.begin();
for (int i=0;i<100&&it!=list.end()&&it->first.v;++i,++it){
printf("%s\n",it->first.name.c_str());
}
printf("###\n");
}
}
printf("\n");
}
return 0;
}