Description
为了更好地维护校园交通秩序,加强对学校电动车的管理,学校保安叔叔们决定对学生们的电动车进行出入通行证管理。
当电动车进入校门时,保安将发放一张通行证。
当电动车离校时,需要将通行证交还保安,方可放行。
每次电动车进入、离开校园时,都需要记录车牌号。
如果出现异常情况(同一电动车连续2次及以上离开校园,或者连续2次及以上进入校园)电动车将不被放行。
Input
输入第一行为T,表示Case数
每组Case,为一连串的电动车进入/离开校园请求。
“IN 车牌号”:例如IN C-1089,表示车牌号为C-1089的电动车希望进入校园。
“OUT 车牌号”:例如OUT C-1089,表示车牌号为C-1089的电动车希望离开校园。
“LIST”:根据被放行的电动车记录,列出在校内的电动车车牌列表(不被放行的记录不算),按第一次出入的顺序排序。
“EXIT”:该组Case结束
碰到异常情况不放行时,输出一行“Error”
车牌号由大小写字母、数字、‘-’组成,长度不超过10。
命令数不超过10000
Sample Input
Sample Output
题意:给出一系列的进出车记录,每当给出命令 LIST,你需要按进出车记录顺序给出
当前在学校的车辆名,当某车名连续 2 次及以上进入或离开校园则当错误处理,
不放行,即使一开始没给出某辆车的进车记录,只有离开记录时是正常的,此时
记录下此车记录,便于按序输出。
分析:用map做车名与下标(1开始)的映射。(不重复)
vis[]=1表示车在校,0为车不在校。
flag[i]记录map中第 i 个记录的车输入的下标。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <string>
#include <utility>
#include <functional>
#include <algorithm>
using namespace std;
#define N 12000
#define inf 0x3f3f3f3f
int vis[N], flag[N];
char car[N][12];
int main()
{
#ifdef OFFLINE
freopen("t.txt", "r", stdin);
#endif
int t, p, i, j, k, num, test = 0;
scanf("%d", &t);
while (t--)
{
printf("Case %d:\n", ++test);
memset(vis, 0, sizeof(vis));
memset(flag, 0, sizeof(flag));
char state[12];
k = p = 0;
num = -1;
map<char*, int> check;
while (cin >> state){
if (strcmp(state, "EXIT") == 0) break;
if (strcmp(state, "LIST") == 0){
for (i = 0; i < check.size(); i++){
if (vis[i + 1])
printf("%s\n", car[flag[i + 1]]);
}
}
else{
p++;
cin >> car[p];
if (strcmp(state, "IN") == 0){
num = -1;
map<char*, int>::iterator it;
for (it = check.begin(); it != check.end(); it++){
if (strcmp(it->first, car[p]) == 0){
num = it->second; break;
}
}
if (num < 0){
check[car[p]] = ++k;
vis[k] = 1;
flag[k] = p;
}
else{
if (vis[num])
puts("Error");
else
vis[num] = 1;
}
}
else if (strcmp(state, "OUT") == 0){
num = -1;
map<char*, int>::iterator it;
for (it = check.begin(); it != check.end(); it++){
if (strcmp(it->first, car[p]) == 0){
num = it->second; break;
}
}
if (num < 0){
check[car[p]] = ++k;
vis[k] = 0;
flag[k] = p;
}
else {
if (vis[num])
vis[num] = 0;
else
puts("Error");
}
}
}
}
}
return 0;
}