QOJ.ac

QOJ

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

#13649. Дублированные бинарные строки

الإحصائيات

Карлос проводит летние каникулы, изучая дублированные бинарные строки. Дублированная бинарная строка — это непустая строка $T$ такая, что:

  • $T$ содержит только символы 0 и 1 (то есть $T$ является бинарной строкой).
  • $T$ может быть записана в виде $T = \overline{UU}$, где $U$ — произвольная бинарная строка, а операция $\overline{ab}$ обозначает конкатенацию строк $a$ и $b$ (то есть запись их друг за другом как одной строки).

Например, 0000 и 011011 являются дублированными бинарными строками, а 01, 0110 и 000 — нет.

Определим силу бинарной строки $S$ как количество различных непрерывных дублированных подстрок, присутствующих в $S$. Две подстроки считаются различными, если они различаются хотя бы одним символом.

Эта задача состоит из двух частей, каждая подзадача относится либо к Части I, либо к Части II. Вы можете решать подзадачи в любом порядке; в частности, вам не обязательно полностью выполнять Часть I перед тем, как приступать к Части II.

Часть I

Карлос присылает вам бинарную строку $S$, и ваша задача — вычислить её силу.

Детали реализации

Вы должны реализовать следующую процедуру:

int count_duplicated(std::string S)
  • $S$: бинарная строка длины $N$.
  • Эта процедура вызывается ровно один раз для каждого тестового примера.

Процедура должна вернуть целое число $K$ — количество различных непрерывных дублированных подстрок, присутствующих в $S$.

Ограничения

  • $4 \le N \le 100$
  • $S[i]$ является либо 0, либо 1 для каждого $i$ такого, что $0 \le i < N$.

Подзадачи

Подзадача Баллы Дополнительные ограничения
1 6 $N = 4$
2 9 Нет дополнительных ограничений.

Примеры

Пример 1

Рассмотрим следующий вызов:

count_duplicated("0101")

В $S$ есть только одна дублированная бинарная подстрока, это 0101. Поэтому процедура должна вернуть 1.

Пример 2

Рассмотрим следующий вызов:

count_duplicated("0000")

В $S$ есть две дублированные бинарные подстроки: 00 и 0000. Следовательно, процедура должна вернуть 2.

Примечание: хотя подстрока 00 встречается в $S$ три раза, в итоговом ответе она учитывается только один раз.

Часть II

Карлос задается вопросом, какими могут быть минимальная и максимальная сила бинарной строки $S$.

Ваша задача — сконструировать бинарные строки длины 100, которые содержат как можно меньше или как можно больше дублированных подстрок. Вы получите баллы в зависимости от количества дублированных подстрок.

Подзадачи

Эта часть состоит из 2 подзадач с выводом в файл (output-only) и частичным оцениванием.

Подзадача Баллы Ограничение
3 25 Минимизировать силу $S$.
4 60 Максимизировать силу $S$.

Детали реализации

Для каждой подзадачи вы должны либо: отправить выходной файл, состоящий из бинарной строки длины 100, либо вернуть бинарную строку в вашей программе при вызове процедуры проверяющей системы.

Каждый выходной файл должен быть в следующем формате:

S

Чтобы сконструировать требуемые бинарные строки в вашей программе, вы должны реализовать следующие процедуры:

std::string find_weakest()
  • Если в вашей посылке предоставлен выходной файл для Подзадачи 3, эта процедура вызываться не будет.
  • В противном случае процедура вызывается в Подзадаче 3 ровно один раз.

Процедура должна вернуть бинарную строку $S$ длины $N = 100$ с минимальной силой.

std::string find_strongest()
  • Если в вашей посылке предоставлен выходной файл для Подзадачи 4, эта процедура вызываться не будет.
  • В противном случае процедура вызывается в Подзадаче 4 ровно один раз.

Процедура должна вернуть бинарную строку $S$ длины $N = 100$ с максимальной силой.

Оценивание

Если ваш вывод не соответствует ограничениям, описанным в деталях реализации, балл за эту подзадачу будет равен 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 (Входные данные для Части I)

1
S

Пример 2 (Выходные данные для Части I)

K

Пример 3 (Входные данные для Части II)

2
T

Здесь $T$ — это либо строка weakest, либо строка strongest.

Пример 4 (Выходные данные для Части II)

S

Примечание: вывод примера проверяющей системы соответствует требуемому формату для выходных файлов в Части II.

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.