/*
*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int> teamid[1001];
queue<int> normal;
int flagNum[1000000+1]; //关键在于这里,一个数的状态,看这个,如果是0,那么不是队列中的,是其他数,就是几号队列的 ;数就带过来了;
int flagTeam[1001];
void init(int n){
while(normal.size()!=0) normal.pop();
for(int i = 0; i < n; ++i){
flagTeam[i] = 0;
while(teamid[i].size() ) teamid[i].pop();
}
}
int main(){
int counter = 0;
int n,m,num;
while(1){
scanf("%d",&n);
if(n == 0) return 0;
init(n);
memset(flagNum, 0, sizeof(int)*1000000+1);
for(int i = 1; i <= n; ++i){
scanf("%d",&m);
for(int j = 0; j < m; ++j){
scanf("%d",&num);
flagNum[num] = i;
}
}
printf("Scenario #%d\n",++counter);
char str[20];
while(1){
scanf("%s",str);
if(strcmp(str,"STOP") == 0) {printf("\n");break;}
if(strcmp(str,"ENQUEUE") == 0){
scanf("%d",&num);
if(flagNum[num] == 0){
normal.push(num);
}else{
if(flagTeam[flagNum[num]] == 0){
teamid[flagNum[num]].push(num);
normal.push(-flagNum[num]);
flagTeam[flagNum[num]] = 1;
}else{
teamid[flagNum[num]].push(num);
}
}
}
else if(strcmp(str,"DEQUEUE") == 0){
if(normal.size() == 0) continue;
if( normal.front() > 0){
printf("%d\n",normal.front());
normal.pop();
}else{
printf("%d\n",teamid[ -normal.front() ].front() );
teamid[ -normal.front() ].pop();
if(teamid[ -normal.front() ].size() == 0){
flagTeam[-normal.front()] = 0;
normal.pop();
}
}
}
}
}
}
这题的难点在于计算速度;(因为数据量大)
解决这题的关键在于: 要用空间换取时间;