QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 4096 MB Total points: 100 Difficulty: [show] Output Only Interactive

#13649. 重复的二进制字符串

统计

Carlos 正在度过他的暑假,研究重复二进制字符串。一个重复二进制字符串是一个非空字符串 $T$,满足:

  • $T$ 仅包含字符 $0$ 和 $1$(即 $T$ 是一个二进制字符串)。
  • $T$ 可以写成 $T = \overline{UU}$ 的形式,其中 $U$ 是任意二进制字符串,且运算 $\overline{ab}$ 表示字符串 $a$ 和 $b$ 的拼接(即作为一个字符串依次写下它们)。

例如,$0000$ 和 $011011$ 是重复二进制字符串,但 $01$、$0110$ 和 $000$ 不是。

定义二进制字符串 $S$ 的强度为 $S$ 中存在的不同连续重复子串的数量。如果两个子串在至少一个字符上不同,则认为它们是不同的。

本题包含两个部分,每个子任务与第一部分(Part I)或第二部分(Part II)相关联。你可以按任意顺序解决子任务;特别地,你不需要在尝试第二部分之前完成第一部分的所有内容。

第一部分 (Part I)

Carlos 发给你一个二进制字符串 $S$,你的任务是计算它的强度。

实现细节

你应该实现以下过程:

int count_duplicated(std::string S)
  • $S$: 长度为 $N$ 的二进制字符串。
  • 该过程对每个测试用例恰好调用一次。

该过程应返回一个整数 $K$,即 $S$ 中存在的不同连续重复子串的数量。

数据范围

  • $4 \le N \le 100$
  • 对于每个 $0 \le i < N$,$S[i]$ 为 $0$ 或 $1$。

子任务

子任务 分值 附加约束
1 6 $N = 4$
2 9 无附加约束

样例

样例 1

考虑以下调用:

count_duplicated("0101")

$S$ 中只有一个重复二进制子串,即 $0101$。因此,该过程应返回 $1$。

样例 2

考虑以下调用:

count_duplicated("0000")

$S$ 中有两个重复二进制子串:$00$ 和 $0000$。因此,该过程应返回 $2$。

注意,尽管子串 $00$ 在 $S$ 中出现了三次,但在最终答案中它只被计算一次。

第二部分 (Part II)

Carlos 想知道二进制字符串 $S$ 的最小和最大强度是多少。

你的任务是构造长度为 $100$ 的二进制字符串,使其包含尽可能少或尽可能多的重复子串。你将根据重复子串的数量获得分数。

子任务

本部分包含 $2$ 个仅输出答案的子任务,采用部分分计分。

子任务 分值 约束
3 25 最小化 $S$ 的强度
4 60 最大化 $S$ 的强度

实现细节

对于每个子任务,你应该:

  • 提交一个包含长度为 $100$ 的二进制字符串的输出文件,或者
  • 在你的程序中向评测程序调用返回一个二进制字符串。

每个输出文件必须采用以下格式:

S

为了在你的解决方案程序中构造所需的二进制字符串,你应该实现以下过程:

std::string find_weakest()
  • 如果你的提交中提供了子任务 3 的输出文件,则不会调用此过程。
  • 否则,该过程在子任务 3 中恰好被调用一次。
  • 该过程应返回一个长度为 $N = 100$ 且强度最小的二进制字符串 $S$。
std::string find_strongest()
  • 如果你的提交中提供了子任务 4 的输出文件,则不会调用此过程。
  • 否则,该过程在子任务 4 中恰好被调用一次。
  • 该过程应返回一个长度为 $N = 100$ 且强度最大的二进制字符串 $S$。

说明

如果你的输出不符合实现细节中描述的约束,则该子任务的得分将为 $0$(在 CMS 中报告为 Output isn't correct)。

令 $K$ 表示给定子任务中你输出字符串的强度。

在子任务 3 中,你的得分根据下表计算:

条件 分数
$20 < K$ $0$
$4 < K \le 20$ $21 - K$
$K = 4$ $20$
$K = 3$ $25$

在子任务 4 中,你的得分根据下表计算:

条件 分数
$K \le 50$ $0$
$50 < K \le 80$ $K - 50$
$80 < K \le 83$ $30 + 5 \cdot (K - 80)$
$K = 84$ $60$

样例

第一部分和第二部分使用相同的样例评测程序,通过输入的第一行来区分这两个部分。

输入格式(第一部分)

1
S

输出格式(第一部分)

K

输入格式(第二部分)

2
T

此处,$T$ 为字符串 weakest 或字符串 strongest

输出格式(第二部分)

S

注意,样例评测程序的输出符合第二部分输出文件所需的格式。

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.