QOJ.ac

QOJ

実行時間制限: 2 s メモリ制限: 256 MB 満点: 100

#13447. 卷积

統計

亚德里亚海海岸和岛屿上点缀着各种形状和大小的迷人海滩。然而,许多海滩无法乘车抵达。为了满足日益增长的需求,海岸附近的一片巨大空地已被改造成一个停车场。由于所有参与设计的建筑师都具有电子工程背景,因此停车场的布局类似于设计电路时常用的串并联图。

停车场由停车位和连接它们的双向道路组成。每条道路连接两个不同的停车位,每对停车位之间最多由一条道路连接。在任何时刻,每个停车位最多只能被一辆车占用。其他车辆无法通过已被占用的停车位。

图 1:构建 splot 的规则,每条规则在下方对应条款中说明

混联停车场(也称为 splot)是一种具有两个特殊停车位(分别称为源点(source)和汇点(terminal))的停车场,它是通过串联和并联组合规则由单个停车位构建而成的。每个 splot 都可以通过其编码来指定——这是一个描述其结构和已停放车辆位置的字符序列。合法的 splot 及其编码递归定义如下:

  1. 仅由单个停车位且无道路组成的停车场是一个合法的 splot。这个单一的停车位既是该 splot 的源点也是汇点。如果该停车位为空,则该 splot 的编码仅为小写字母 o;如果该停车位被车辆占用,则编码为小写字母 x
  2. 如果 $G_1$ 和 $G_2$ 是两个合法的 splot,它们的串联组合 $G$ 也是一个 splot。串联组合是通过在 $G_1$ 的汇点和 $G_2$ 的源点之间增加一条道路得到的。新得到的 splot $G$ 的源点是 $G_1$ 的源点,而 $G$ 的汇点是 $G_2$ 的汇点。如果 $E_1$ 和 $E_2$ 分别是 splot $G_1$ 和 $G_2$ 的编码,那么 $G$ 的编码为 SE1E2#。换句话说,该编码是通过将大写字母 S、被组合的 splot 的编码以及井号字符 # 拼接而成的。
  3. 如果 $G_1$ 和 $G_2$ 是两个合法的 splot,它们的并联组合 $G$ 也是一个合法的 splot。并联组合是通过增加两个名为 $s$ 和 $t$ 的新停车位,并在 $s$ 与 $G_1$ 和 $G_2$ 的源点之间增加道路,以及在 $t$ 与 $G_1$ 和 $G_2$ 的汇点之间增加道路而得到的。新得到的 splot $G$ 的源点是新增加的停车位 $s$,而汇点是新增加的停车位 $t$。如果 $E_1$ 和 $E_2$ 分别是 splot $G_1$ 和 $G_2$ 的编码,且 $E_s$ 和 $E_t$ 分别是源点 $s$ 和汇点 $t$ 的编码(如果对应车位为空则为小写字母 o,否则为小写字母 x),那么 $G$ 的编码为 PEs|E1E2|Et#。换句话说,该编码是通过将大写字母 P、源点停车位的编码、竖线字符 |、被组合的 splot 的编码、另一个竖线字符 |、汇点停车位的编码以及最后的井号字符 # 拼接而成的。

图 2:对应第一个样例的 splot

例如,上图中给出的 splot 的编码为 Po|Px|Sxo#Soo#|o#Soo#|o#。请注意,splot $G$ 的编码中小写字母的数量总是与 $G$ 中的停车位数量相同,并且 $G$ 中的停车位与其编码中的小写字母之间存在一一对应关系。

整个停车场恰好有一个出口,它直接连接到整个 splot 的源点停车位。如果一辆车能够离开 splot,即它可以通过某条由道路和空车位组成的路径到达源点停车位,我们就说这辆车未被阻塞。例如,在上面的 splot 中,两辆车都没有被阻塞,但如果我们要在该 splot 的汇点(最右侧的节点)停放一辆车,那么其中一辆车就会被阻塞。允许在 splot 的源点停车位停放车辆,然而,如果我们这样做,splot 中的所有其他车辆都将被阻塞。

任务

停车场的管理员希望安排驶入的车辆,使得没有任何车辆被阻塞。假设给我们一个可能已经停放了一些车辆的 splot,且这些已有的车辆都没有被阻塞。编写一个程序,计算在不移动任何已有车辆、且没有任何车辆被阻塞的前提下,该 splot 中最多可以停放的车辆总数(包括已有的车辆)。此外,你的程序还应该找出一种达到该最大车辆数的车辆安排方案。

输入格式

输入的第一行包含一个长度至少为 1 且最多为 100,000 的字符序列——即给定 splot 的编码。序列中出现的字符仅限于大写字母 PS、小写字母 ox,以及字符 #(ASCII 35)和 |(ASCII 124)。输入将是符合上述规则的 splot 编码。输入中 splot 里已有的车辆均未被阻塞。

输出格式

输出应包含 2 行。

第一行应包含一个整数 $M$——如上所述,splot 中最多可以停放的车辆数量。

第二行应包含一个字符序列——具有最优车辆安排方案的 splot 编码。该序列应恰好包含 $M$ 个字母 x,并且必须能够通过将输入序列中的某些字母 o 替换为 x 来得到。

可能存在多种最优安排方案,你的程序可以输出其中任意一种。

子任务

  • 如果输出不正确或不完整,但输出的第一行(最大车辆数)是正确的,则该测试点将获得 80% 的分数。
  • 在总分值为 30 分的测试点中,splot 中的总停车位数量最多为 20。
  • 在另外总分值为 40 分的测试点中,splot 是空的,即输入中不包含字母 x

样例

输入样例 1

Po|Px|Sxo#Soo#|o#Soo#|o#

输出样例 1

3
Po|Px|Sxo#Sox#|o#Soo#|o#

输入样例 2

Po|SPo|oo|o#Px|oo|o##Po|Sxo#Po|ox|o#|o#|o#

输出样例 2

7
Po|SPo|xx|o#Px|ox|o##Po|Sxx#Po|ox|o#|o#|o#

工具支持

一个名为 splot_tool 的可执行文件(可通过竞赛系统下载)可以帮助你可视化测试输入和输出。该工具接受一个文件名作为参数——可以是格式合法的输入文件,也可以是该任务的输出文件,并生成一个描绘文件中编码的 splot 的 SVG 图像。生成的图像可以使用网页浏览器查看。该工具的使用示例如下:

$ ./splot_tool splot.dummy.out.1
splot.dummy.out.1 parsed (10 parking spaces).
splot.dummy.out.1.svg created.
$ chromium splot.dummy.out.1.svg

该工具将检查 splot 是否格式正确,否则会给出相应的错误信息。它不会进行任何其他合法性检查——即使解决方案不正确,文件也可能正常渲染。

该工具仅适用于编码长度最多为 200 个字符的 splot。

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.