QOJ.ac

QOJ

Limite de temps : 3.0 s Limite de mémoire : 256 MB Points totaux : 100

#15662. 怪物仓库

Statistiques

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 的问题相对应。

对于每个 BUYSELLPACKUNPACK 请求,如果请求没有被丢弃,你应该输出 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

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.