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