FZU 2084--电动车通行证制度 ( 模拟 )


电动车通行证制度
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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

2IN ABCIN DEFIN ABCOUT DDDOUT DEFOUT DEFLISTEXITIN aaaIN bbbOUT cccLISTEXIT

Sample Output

Case 1:ErrorErrorABCCase 2:aaabbb

题意:给出一系列的进出车记录,每当给出命令 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值