QOJ.ac

QOJ

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

#13649. Zduplikowane ciągi binarne

الإحصائيات

Carlos spędza wakacje, badając zduplikowane ciągi binarne. Zduplikowany ciąg binarny to niepusty ciąg $T$ taki, że:

  • $T$ zawiera tylko znaki 0 i 1 (czyli $T$ jest ciągiem binarnym).
  • $T$ można zapisać w postaci $T = \overline{UU}$, gdzie $U$ jest dowolnym ciągiem binarnym, a operacja $\overline{ab}$ oznacza konkatenację ciągów $a$ i $b$ (czyli zapisanie ich jeden po drugim jako pojedynczy ciąg).

Na przykład, 0000 oraz 011011 są zduplikowanymi ciągami binarnymi, ale 01, 0110 oraz 000 nie są.

Zdefiniujmy siłę ciągu binarnego $S$ jako liczbę różnych spójnych zduplikowanych podciągów obecnych w $S$. Dwa podciągi uważa się za różne, jeśli różnią się co najmniej jednym znakiem.

To zadanie składa się z dwóch części, z których każde podzadanie jest powiązane z Częścią I lub Częścią II. Podzadania można rozwiązywać w dowolnej kolejności; w szczególności nie jest wymagane ukończenie całej Części I przed przystąpieniem do Części II.

Część I

Carlos przesyła Ci ciąg binarny $S$, a Twoim zadaniem jest obliczenie jego siły.

Szczegóły implementacji

Powinieneś zaimplementować następującą procedurę:

int count_duplicated(std::string S)
  • $S$: ciąg binarny o długości $N$.
  • Ta procedura jest wywoływana dokładnie raz dla każdego przypadku testowego.

Procedura powinna zwrócić liczbę całkowitą $K$, będącą liczbą różnych spójnych zduplikowanych podciągów obecnych w $S$.

Ograniczenia

  • $4 \leq N \leq 100$
  • $S[i]$ jest równe 0 lub 1 dla każdego $i$ takiego, że $0 \leq i < N$.

Podzadania

Podzadanie Punkty Dodatkowe ograniczenia
1 6 $N = 4$
2 9 Brak dodatkowych ograniczeń.

Przykład

Przykład 1

Rozważ następujące wywołanie:

count_duplicated("0101")

Istnieje tylko jeden zduplikowany podciąg binarny w $S$, którym jest 0101. Dlatego procedura powinna zwrócić 1.

Przykład 2

Rozważ następujące wywołanie:

count_duplicated("0000")

Istnieją dwa zduplikowane podciągi binarne w $S$: 00 oraz 0000. Stąd procedura powinna zwrócić 2.

Zauważ, że chociaż podciąg 00 występuje w $S$ trzy razy, w ostatecznym wyniku jest liczony tylko raz.

Część II

Carlos zastanawia się, jaka może być minimalna i maksymalna siła ciągu binarnego $S$.

Twoim zadaniem jest skonstruowanie ciągów binarnych o długości 100, które zawierają jak najmniej lub jak najwięcej zduplikowanych podciągów. Otrzymasz punkty w oparciu o liczbę zduplikowanych podciągów.

Podzadania

Ta część składa się z 2 podzadań typu "output-only" z częściową punktacją.

Podzadanie Punkty Ograniczenie
3 25 Zminimalizuj siłę $S$.
4 60 Zmaksymalizuj siłę $S$.

Szczegóły implementacji

Dla każdego podzadania powinieneś:

  • przesłać plik wyjściowy składający się z ciągu binarnego o długości 100, lub
  • zwrócić ciąg binarny w swoim programie do wywołania procedury sprawdzającej (grader).

Każdy plik wyjściowy musi być w następującym formacie:

S

Aby skonstruować wymagane ciągi binarne w swoim programie rozwiązującym, powinieneś zaimplementować następujące procedury:

std::string find_weakest()
  • Jeśli w Twoim zgłoszeniu dostarczono plik wyjściowy dla Podzadania 3, ta procedura nie będzie wywoływana.
  • W przeciwnym razie procedura jest wywoływana w Podzadaniu 3 dokładnie raz.

Procedura powinna zwrócić ciąg binarny $S$ o długości $N = 100$ o minimalnej sile.

std::string find_strongest()
  • Jeśli w Twoim zgłoszeniu dostarczono plik wyjściowy dla Podzadania 4, ta procedura nie będzie wywoływana.
  • W przeciwnym razie procedura jest wywoływana w Podzadaniu 4 dokładnie raz.

Procedura powinna zwrócić ciąg binarny $S$ o długości $N = 100$ o maksymalnej sile.

Podzadania

Jeśli Twoje wyjście nie jest zgodne z ograniczeniami opisanymi w szczegółach implementacji, wynik Twojego rozwiązania dla tego podzadania wyniesie 0 (zgłoszone jako Output isn't correct w systemie CMS).

Niech $K$ oznacza siłę ciągu w Twoim wyjściu dla danego podzadania.

W Podzadaniu 3 Twój wynik jest obliczany zgodnie z poniższą tabelą:

Warunek Punkty
$20 < K$ 0
$4 < K \leq 20$ $21 - K$
$K = 4$ 20
$K = 3$ 25

W Podzadaniu 4 Twój wynik jest obliczany zgodnie z poniższą tabelą:

Warunek Punkty
$K \leq 50$ 0
$50 < K \leq 80$ $K - 50$
$80 < K \leq 83$ $30 + 5 \cdot (K - 80)$
$K = 84$ 60

Przykład

Części I i II używają tego samego przykładowego programu sprawdzającego (grader), przy czym rozróżnienie między dwiema częściami jest określone przez pierwszą linię wejścia.

Wejście 1

1
S

Wyjście 1

K

Wejście 2

2
T

Tutaj $T$ jest albo ciągiem weakest, albo ciągiem strongest.

Wyjście 2

S

Zauważ, że wyjście przykładowego gradera jest zgodne z wymaganym formatem plików wyjściowych w Części 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.