Informatyczny kącik olimpijski
Yet Another Substring Reverse
Tym razem omówimy zadanie Yet Another Substring Reverse, które pojawiło się na portalu www.codeforces.com.
Zadanie. Dane jest słowo o długości
zawierające wystąpienia części liter alfabetu angielskiego
W słowie
należy odwrócić jedno podsłowo, tzn. zastąpić je zapisem od prawej do lewej, aby otrzymać możliwie najdłuższe różnorodne podsłowo, czyli takie, które nie zawiera powtórzeń liter. Jaka jest długość najdłuższego różnorodnego podsłowa, które można uzyskać? Przykładowo dla
wynikiem jest 3. Po odwróceniu fragmentu od trzeciej do szóstej litery otrzymujemy
którego najdłuższy różnorodny fragment to
Niech oznacza podsłowo
Na samym początku zauważmy, że długość różnorodnego podsłowa nie przekroczy
Najdłuższe różnorodne podsłowo
Załóżmy przez chwilę, że nie wykonujemy odwrócenia i chcemy znaleźć długość najdłuższego różnorodnego podsłowa. Dla każdej pozycji początkowej wyznaczmy najdłuższe różnorodne podsłowo, które się w niej zaczyna. Formalnie dla ustalonego znajdźmy takie największe
że
jest różnorodne. Zacznijmy od jednoliterowego podsłowa
i rozszerzajmy je o kolejne litery, dopóki nie nastąpi powtórzenie. Do sprawdzania, czy jakaś litera wystąpiła wcześniej, można wykorzystać tablicę zliczającą, którą po każdym rozszerzeniu aktualizujemy. Opisane rozwiązanie działa w czasie
gdyż od każdej pozycji początkowej wykonamy co najwyżej
rozszerzeń w prawo.
Najdłuższe różnorodne podsłowo
W tym rozwiązaniu, podobnie jak wcześniej, dla każdej pozycji chcemy wyznaczyć takie największe
że
jest różnorodne. Skorzystajmy z metody gąsienicy. Otóż, tym razem nie będziemy dla każdej pozycji początkowej rozpoczynali przeszukiwania od słów jednoliterowych. Zauważmy, że jeśli
jest różnorodne, to również
jest różnorodne. Zatem nie ma potrzeby sprawdzania słów, które kończą się wcześniej niż
Do sprawdzania powtórzeń wykorzystujemy tablicę zliczającą. Przy rozszerzaniu słowa z prawej strony dodajemy literę, a przy przejściu do kolejnej pozycji początkowej usuwamy literę z tablicy zliczającej. Rozwiązanie działa w czasie
gdyż każda litera zostanie dokładnie raz dodana i raz usunięta z tablicy zliczającej.
Rozwiązanie
Opisaliśmy metody znajdowania najdłuższego różnorodnego podsłowa, zatem możemy przejść do pierwszego rozwiązania zadania. Rozważmy odwrócenie każdego z podsłów. Dla każdego przypadku znajdźmy najdłuższe różnorodne podsłowo za pomocą jednej z wyżej opisanych metod i wybierzmy najlepszy wynik. W zależności od wykorzystanej metody otrzymamy rozwiązanie
lub
Rozwiązanie
Zauważmy, że możemy zredukować zadanie do znalezienia dwóch różnorodnych podsłów, które mają rozłączne zbiory liter oraz największą sumaryczną długość. Formalny dowód tego faktu pozostawiamy Czytelnikowi, a teraz pokażemy, jak dwa podsłowa, oraz
niemające wspólnych liter umieścić obok siebie za pomocą jednego odwrócenia. Załóżmy bez straty ogólności, że
występuje na lewo od
wówczas należy odwrócić
Teraz
jest różnorodne.
Znajdźmy wszystkie różnorodne podsłowa, których jest Następnie rozważmy każdą z
par takich podsłów. Jeśli podsłowa mają rozłączne zbiory liter, wtedy razem tworzą różnorodne podsłowo. Sprawdzenie, czy zbiory liter są rozłączne, możemy wykonać metodą zliczenia w czasie
Spośród par tworzących różnorodne podsłowa wybieramy tę, której sumaryczna długość fragmentów jest największa. Otrzymaliśmy rozwiązanie o złożoności czasowej
Rozwiązanie
Zauważmy, że kolejność liter w podsłowie nie ma znaczenia, zatem każde różnorodne podsłowo możemy rozważać jako zbiór liter. Spośród wszystkich podsłów o długości co najwyżej znajdźmy te, które są różnorodne, i zbiory ich liter oznaczmy jako zbiór
Przykładowo dla
Wyznaczenie
zajmuje czas
zaś moc
wynosi co najwyżej
Zadanie redukuje się teraz do znalezienia dwóch rozłącznych zbiorów w
których suma ma największą moc.
Dla każdego zbioru znajdźmy taki zbiór
że
oraz
jest maksymalne. Innymi słowy dla każdego zbioru znajdźmy inny zbiór, który tworzy z nim najlepszy wynik. Wówczas odpowiedzią w zadaniu jest maksimum z rozważonych przypadków. Niech
dla każdego
oznacza moc największego takiego zbioru
że
Teraz
tworzy najdłuższe różnorodne podsłowo o długości
gdzie
oznacza dopełnienie
Pozostało nam jeszcze wyznaczyć wartości które będziemy obliczali w kolejności niemalejących mocy zbiorów. Załóżmy, że obliczamy
i mamy obliczone
dla wszystkich
Jeśli
wówczas
W przeciwnym przypadku
czyli największy podzbiór
należący jednocześnie do
nie zawiera jakiegoś elementu
zatem
Obliczenie
zajmuje czas
wartości tablicy
jest
zatem czas potrzebny do obliczenia
wynosi
Całe rozwiązanie działa w czasie