QOJ.ac

QOJ

時間限制: 1.0 s 記憶體限制: 256 MB 總分: 100

#12110. DNA 字典

统计

为了辅助你的研究,Bakhyt 提供了一个 DNA 字典——一种存储了 $N$ 个 DNA 字符串的数据结构。DNA 字符串是长度为 $K$ 的字符串,仅由大写字母 ‘A’、‘C’、‘G’ 和 ‘T’ 组成。

不幸的是,这个字典的接口很奇怪,你需要找到一种正确使用它的方法。

该字典允许你使用模板访问其数据。模板是一个长度为 $K$ 的字符串,可以包含三种类型的字符:大写字母 ACGT、问号和下划线。对于给定的模板,字典会检查其所有 DNA 字符串是否与模板匹配,并告知匹配字符串的相关信息。如果字符串 $S$ 在每个位置 $i$ ($1 \le i \le K$) 都与模板 $T$ 匹配($T_i$ 为下划线的位置除外),则称 $S$ 与模板 $T$ 匹配。位置上的匹配规则如下:

  • ‘A’、‘C’、‘G’、‘T’ —— 如果 $T_i$ 是这些字母之一,则仅当 $S_i$ 等于 $T_i$ 时,该位置匹配。
  • ‘?’ —— 如果 $T_i$ 是问号,则无论 $S$ 如何,该位置均匹配。

该字典仅有一个函数:

  • get_min_max(T) —— 查找与给定模板 $T$ 匹配的字典中字典序最小和最大的字符串。

模板中的下划线表示该位置在检查过程中会被完全忽略。get_min_max(T) 返回的字符串在 $T$ 包含下划线的位置处也会包含下划线。

你需要找到一种方法,对于任意给定的 DNA 字符串,确定字典中按字母顺序排列在其之后(或等于它)的字符串。

交互

你的提交不得从标准输入读取数据、向标准输出打印数据或与任何其他文件交互。

你需要实现以下函数:

string find_next(string P)

  • $P$ 是一个长度为 $K$ 的 DNA 字符串。
  • 该函数必须返回字典中字典序大于或等于 $P$ 的最小字符串。
  • 如果不存在这样的字符串,函数必须返回一个空字符串。

你可以调用以下函数:

pair <string, string> get_min_max(string T)

  • $T$ 是一个长度为 $K$ 的模板字符串。
  • 该函数将返回字典中与模板 $T$ 匹配的字典序最小和最大的字符串对,且在 $T$ 包含下划线的位置处返回下划线。
  • 如果没有字符串与模板匹配,函数将返回一对空字符串。

在每个测试用例中,你总共最多可以进行 2500 次函数调用。如果违反了上述任何条件,你的程序将获得 Wrong Answer 判决。否则,你的程序将获得 Accepted 判决,你的得分将根据 get_min_max 函数的调用总次数以及所有调用中参数包含的问号总数来计算(请参阅“子任务”部分)。

子任务

在本任务中,评测机不是自适应的。这意味着字典的内容在运行开始时是固定的,不依赖于你程序的调用。

本任务包含两个子任务:

  1. (10 分) $K = 4$。
  2. (90 分) $K = 256, N \le 2 \times K$。在此子任务中,你的得分计算方式如下: 设 $q$ 为调用 get_min_max 函数的总次数,$m$ 为所有调用中 get_min_max 参数所使用的问号总数。则你的得分计算如下:
    • 如果 $q + m \ge 2500$,得分为 0。
    • 如果 $q + m \le 550$,得分为 90。
    • 如果 $550 < q + m < 2500$,得分按公式 $\frac{2500-(q+m)}{2500-550} \cdot 90$ 计算。

注意,该子任务的最终得分为你在所有测试点中得分的最小值。

说明

样例评测机按以下格式读取输入:

  • 第 1 行:$N, K$
  • 第 2 行:$S_1, S_2, ..., S_n$

你可以在系统中下载 dnadict.zip,其中包含 Java 和 C++11 语言的示例。 上述内容中包含了所有函数调用的示例。 dnadict.zip 包含每种语言的解决方案示例。 对于 Java 语言的解决方案,文件和类名必须分别命名为 Dnadict.javaDnadict

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.