Mike 和 Sally 在怪兽电力公司(Monster Inc.)的仓库担任保管员。他们的日常任务是处理传入的请求并更新仓库的库存。请求仅包括购买(buying)、出售(selling)、拆包(unpacking)和打包(packing)箱子(containers)。仓库中包含货物(goods)和箱子,且拥有无限的空间。一个箱子可能包含货物或其他箱子作为子箱子(sub-containers)。
请求的具体格式如下:
BUY <CONTAINER_DESCRIPTION>SELL <CONTAINER_ID>UNPACK <CONTAINER_ID>PACK <CONTAINER_DESCRIPTION>
每个不处于任何其他箱子内部的箱子都由一个唯一的正整数 ID 标识。为箱子分配 ID 是顺序进行的,且从 1 开始。一个 ID 是有效的,当且仅当其对应的箱子存在于仓库中,否则它是无效的。
箱子描述(container description)被括在圆括号中,并列出其内容物,内容物可以是货物或子箱子。货物仅通过其名称来标识,名称由不区分大小写的英文字母组成。一种货物可能存在多个单位。为了表示数量,可以在货物名称之前或之后放置一个正整数 $N$(用一个空格隔开),其中 $N < 100$ 是该货物的数量。例如,((tomato, potato), 4 celery, (wood, (silk 3, banana 2))) 描述了一个包含四个单位的 celery 和两个子箱子的箱子。
每个请求的描述如下:
- BUY:一个新箱子被运入仓库,并为其分配一个 ID。
- SELL:将一个具有给定 ID 的现有箱子运出,其 ID 变得无效。
UNPACK:从箱子中提取所有货物和子箱子,并将其添加到仓库中。此外,子箱子会变成新的箱子并获得它们自己的 ID。为新箱子分配 ID 的顺序基于它们在箱子描述中出现的顺序(从左到右)。例如,将以下两行作为前两个请求,会导致向仓库中添加一个单位的
celery并添加三个 ID 分别为 2、3 和 4 的箱子,且 ID 1 变得无效。BUY (celery, (Banana), (Celery), (celery)) UNPACK 1
- PACK:将
PACK请求中指定的货物组合到一个新箱子中,然后为其分配下一个可用的 ID。
Mike 和 Sally 按照接收到的顺序处理请求。任何带有无效箱子 ID 的请求都必须被丢弃(discarded)。此外,对于 PACK 请求,他们需要检查仓库中(即所有箱子外部)是否存在足够数量的每种货物。
怪兽电力公司的监督员 Roz 曾对 Mike 说过:“我一直在看着你,大眼仔(Wazowski)。一直在看着。一直都是。”她把办公桌推到了他们的办公室里,并要求查看请求和报告。她关注每一个细节。她正在审查每个请求,并可能会提出一些问题。她的问题可能是以下几种类型之一:
? COUNT <good>:在所有箱子外部存在多少个单位的给定货物?? CONTAINS <good>:有多少个拥有 ID 的箱子包含给定的货物?即,该货物直接在箱子中,或者存在一个递归包含该货物的子箱子。? MIN <good>:为了获得至少一个单位的该货物,最少需要拆包多少个箱子?如果不可能,则答案应为 -1。
Mike 和 Sally 需要仅用一个整数来回答这些查询。
在帮助 Mike 和 Sally 之前,请仔细阅读样例。
输入格式
输入包含 $n$ 个来自 Roz 在审查时的请求或查询($1 \le n \le 5000$);每个请求或查询占独立的一行。每种货物的名称长度限制在 100 个字符以内。每个箱子的描述最多可能包含 5000 个字符,且输入总大小小于 $10^6$ 个字符。
输出格式
报告的每一行与一个请求或 Roz 的问题相对应。
对于每个 BUY、SELL、PACK、UNPACK 请求,如果请求没有被丢弃,你应该输出 OK。否则,输出 DISCARD。
如果请求是 UNPACK 且成功执行,在输出 OK 之后,你还应该输出 , X container(s) added.,其中 $X$ 表示新加入仓库的箱子数量(如果数量为 0,则 $X$ 为 No 且使用复数 containers;如果数量为 1,则 $X$ 为 1 且使用单数 container;如果数量大于 1,则 $X$ 为对应的数字且使用复数 containers。详情请参考样例)。
对于 Roz 的每个查询,在单行中仅输出一个整数。
样例
输入样例 1
BUY (10 apple, 10 carrot, 10 banana, ()) UNPACK 1 UNPACK 2 PACK (3 apple, (5 cArrot, 2 banana)) PACK (3 apple, (5 carrOt, 1 banana)) PACK (5 apple, (3 banana)) ? MIN apple ? MIN CaRRoT ? CONTAINS apple
输出样例 1
OK OK, 1 container added. OK, No containers added. OK OK DISCARD 0 2 2
输入样例 2
BUY (apple, (banana, 3 carrot)) BUY ((banana, apple), (banana, carrot)) ? MIN apple UNPACK 1 ? COUNT apple ? COUNT carrot ? CONTAINS banana
输出样例 2
OK OK 1 OK, 1 container added. 1 0 2
输入样例 3
BUY ((duck 2, carrot), 1 celery) ? MIN duck ? MIN carrot ? MIN celery ? MIN test SELL 10 PACK (celery) UNPACK 1 UNPACK 1 PACK (celery) ? COUNT celery ? COUNT carrot ? CONTAINS celery ? CONTAINS carrot BUY ((duck 8, carrot), ((7 duck), celery)) UNPACK 4 UNPACK 5 UNPACK 6 ? COUNT DUCK ? MIN duck
输出样例 3
OK 2 2 1 -1 DISCARD DISCARD OK, 1 container added. DISCARD OK 0 0 1 1 OK OK, 2 containers added. OK, No containers added. OK, 1 container added. 8 0