Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Różne słowa

Jakub Radoszewski

o artykule ...

  • Publikacja w Delcie: kwiecień 2014
  • Publikacja elektroniczna: 31-03-2014
  • Wersja do druku [application/pdf]: (237 KB)

W tym kąciku omówimy zadanie Różne słowa z Obozu Naukowo-Treningowego im. A. Kreczmara w 2013 roku.

obrazek

Zadanie. Dane jest math słów o długości math Słowa składają się z małych i wielkich liter alfabetu łacińskiego. Naszym zadaniem jest stwierdzić, czy istnieje wśród nich para kompletnie różnych ów, czyli słów, które na odpowiadających sobie pozycjach mają różne litery.

Słowa math i  math są więc kompletnie różne, jeśli math dla każdego math Mimo prostego sformułowania rozwiązanie zadania wymaga pewnej pomysłowości. Przedstawimy dwa różne podejścia do rozwiązania.

Pierwszy pomysł będzie opierał się na zasadzie włączeń-wyłączeń. W pierwszym kroku dla każdego słowa wyznaczymy wszystkie wzorce, do których ono pasuje. Wzorcem nazywamy tutaj słowo długości math które oprócz liter może zawierać znaki zapytania – znak zapytania zastępuje we wzorcu dowolną literę. Przykładowo, ze słowa abcab można otrzymać m.in. wzorce a?c??????b. Zastępując każdą możliwą kombinację liter w słowie znakami zapytania, dla jednego słowa otrzymamy math różnych wzorców. Wszystkie te informacje możemy następnie połączyć w jedną tabelę, która dla każdego wzorca zapamięta liczbę wejściowych słów pasujących do niego. Ze względu na konieczność posortowania par: wzorzec-słowo złożoność czasowa konstrukcji takiej tabeli wyniesie math

Zaopatrzeni w tabelę wzorców możemy już zastosować zasadę włączeń-wyłączeń. Dla każdego z wejściowych słów chcemy wyznaczyć liczbę par kompletnie różnych słów, w skład których to słowo wchodzi. Ustalmy jedno słowo wejściowe  math  i oznaczmy przez math  liczbę wejściowych słów, które zgadzają się ze słowem math  na math-tej pozycji math Wówczas wynik dla słowa math  możemy obliczyć ze wzoru:

display-math

Zauważmy, że składnik math  w powyższej sumie odpowiada liczbie słów wejściowych pasujących do wzorca powstałego z  math  poprzez zastąpienie liter na wszystkich indeksach poza math znakami zapytania. Liczbę takich słów możemy odczytać bezpośrednio z tabeli wzorców. Łączny koszt drugiej fazy rozwiązania to math jest on zdominowany przez koszt pierwszej fazy. Zauważmy, że opisane rozwiązanie pozwala nie tylko stwierdzić, czy wśród podanych słów jest jakaś para kompletnie różnych słów, lecz także wyznaczyć liczbę takich par.

Drugie rozwiązanie koncentruje się na alfabecie, czyli na zbiorze liter występujących w słowach. W naszym zadaniu alfabet ma math  litery. Zastanówmy się, co by było, gdybyśmy mieli do czynienia z dużo mniejszym alfabetem: alfabetem dwuliterowym. Wówczas mielibyśmy tylko math różnych słów i dla każdego słowa umielibyśmy wskazać jedyne słowo, które tworzyłoby z nim parę kompletnie różnych słów; byłoby to słowo stanowiące „negację” pierwszego. Rozwiązanie zadania w tym przypadku nie przedstawiałoby żadnych trudności. W naszym zadaniu nie mamy do czynienia z tak prostym przypadkiem. Spróbujemy jednak sprowadzić je do tego przypadku, wprowadzając do rozwiązania element losowości.

Każdej literze alfabetu przyporządkujemy losowo bit 0 lub 1. Co więcej, uczynimy to osobno dla każdej pozycji w słowach, przy czym losowania na poszczególnych pozycjach będą niezależne. W ten sposób sprowadzimy zadanie do przypadku binarnego, lecz, niestety, utracimy pewien zasób informacji. Dokładniej, wiemy, że jeśli po tym przyporządkowaniu jakieś dwa słowa są wzajemnie negacjami, to przed zamianą liter były one kompletnie różne, jednak implikacja odwrotna nie musi zachodzić. Zastanówmy się, jakie jest prawdopodobieństwo tego, że dana para kompletnie różnych słów przeszła na parę słów będących wzajemnie negacjami. W przypadku jednej pozycji jest ono równe math gdyż taka jest szansa na to, że dwie ustalone różne litery oryginalnego alfabetu otrzymały w losowaniu różne bity. Ponieważ losowania na poszczególnych pozycjach były niezależne, więc szukane prawdopodobieństwo z uwzględnieniem wszystkich pozycji jest równe math

Aby zwiększyć nasze szanse, możemy całe losowanie wielokrotnie powtórzyć. Szansa na to, że po wykonaniu math prób dane dwa kompletnie różne słowa ani razu nie okażą się wzajemnie negacjami, wynosi math Jeśli zatem wykonamy math  losowań, gdzie math prawdopodobieństwo porażki będzie znikome:

display-math

Złożoność całego rozwiązania wynosi math  Za pomocą tego samego podejścia można bez problemu wyznaczyć jakieś math  par kompletnie różnych słów z wejścia (lub wszystkie takie pary, jeśli jest ich mniej niż  math ), czego wymagało oryginalne polecenie omawianego zadania.