这是一个交互式问题。在输出每一行后,请务必刷新输出缓冲区。在 C++ 中,可以使用 cout << flush;在 Java 中,可以使用 System.out.flush();在 Python 中,可以使用 sys.stdout.flush()。你必须严格遵守“交互协议”部分的说明,否则可能会收到“答案错误”(Wrong Answer)、“超出时间限制”(Time Limit Exceeded)或其他判决。
由于矿井工作既艰苦又耗时,矮人们决定寻求帮助来自动化部分任务。他们目前的任务是将 $N$ 个矿石(编号为 $1$ 到 $N$)分类到不同的类别中。为了辅助这项工作,矮人工人安装了一条新的传送带。矮人们可以将矿石样本添加到传送带的开头,并从末端移除它们(即移除最早添加的矿石)。
不幸的是,这条传送带没有知识库,因此它无法识别传送带上任何矿石的类别。然而,它有一个非常有用的功能:它会显示当前传送带上有多少种不同的矿石类别。事实证明,这对矿井来说已经足够了,因为矮人们不需要知道每个矿石的类别:他们只需要将矿石按类别分堆即可。
你能利用这条传送带帮助矮人们完成这项任务吗?
交互协议
矿石的类别在开始时是固定的,且不依赖于所做的查询。
首先,读取一行包含一个整数 $N$,即要分类的矿石数量。然后,你可以执行以下两种类型的操作:
+ id— 将标识符为id的矿石添加到传送带的开头。-— 移除传送带末端的矿石。如果传送带为空,则什么也不会发生。
每次操作后,传送带会输出一行,包含当前传送带上不同类别的数量。
要输出答案,首先打印一行,包含 !,后跟 $k$,即矿井中不同类别的数量。然后打印 $k$ 行,每行描述一个类别。每行应包含一个数字 $c_i$,后跟该类别中 $c_i$ 个矿石的标识符。$N$ 个矿石中的每一个都必须出现在且仅出现在一个类别中。你可以以任何顺序输出类别以及每个类别内的矿石。
请记住在每次操作后以及写出答案后刷新输出。请记住在数字与 +、-、! 符号之间留出空格。你必须读取来自交互器的所有数据。
限制
$1 \le N \le 500$,你最多可以执行 $35\,000$ 次操作。
样例
输入格式 1
3 1 2 2 2
输出格式 1
+ 1 + 2 + 3 - ! 2 2 1 3 1 2
说明
第一个样例测试中,$N = 3$,矿石 $1, 2, 3$ 的类别分别为 $1, 2, 1$。
本地测试
在“文件”部分,你可以找到包含样例测试和评分器 grader.cpp 的 A.zip。要测试你的解决方案,请编译它,然后将测试名称和你的可执行文件传递给编译后的 ./grader:
./grader [test] [executable]
例如:./grader 0b.in ./abc
样例评分器不保证与官方评分器的行为完全一致。然而,官方评分器也不是自适应的。