Editorial for Algogoge
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Prvo ćemo preračunati sledeće dve vrednosti: i
, koje označavaju koliko možemo najviše podsekvenci
uzeti iz podstringa
i koliko slova
, koje nismo iskoristili za neki stringova
, postoji u tom podstringu. Primetimo da je rešenje binarno pretraživo, tj. ukoliko možemo da pronađemo
podsekvenci
, onda sigurno mozemo da pronadjemo i
podsekvenci za svako
. Binarno pretražujemo po rešenju i proveravamo da li je moguće pronaći
podsekvenci
u stringu. Sada prolazimo kroz string i pamtimo koliko smo do sada "napravili" stringova
,
,
,
,
i
.
Delimo na slučajeve po vrednosti trenutnog karaktera:
- Nastavljamo na sledeći karakter.
- Povećamo broj napravljenih stringova
za
.
- Ukoliko broj napravljenih stringova
nije
, povećamo broj napravljenih stringova
za
i smanjimo broj napravljenih stringova
za
.
- Ukoliko broj napravljenih stringova
nije
, povećamo broj napravljenih stringova
za
i smanjimo broj napravljenih stringova
za
.
- Ukoliko broj napravljenih stringova
nije
, povećamo broj napravljenih stringova
za
i smanjimo broj napravljenih stringova
za
.
- Ukoliko nema napravljenih stringova
ni napravljenih stringova
, nastavljamo na sledeći karakter. Ukoliko nema napravljenih stringova
, povećamo broj napravljenih stringova
za
i smanjimo broj napravljenih stringova
za
. Ukoliko nema napravljenih stringova
, povećamo broj napravljenih stringova
za
i smanjimo broj napravljenih stringova
za
. Ostaje slučaj u kojem postoje napravljeni i string
i string
, tj. možemo da biramo za koji ćemo string iskoristiti trenutni karakter. Neka je
broj napravljenih stringova
. Primetimo da ćemo za sve napravljene stringove
(neka je broj takvih stringova
) iskoristiti neko
iz podstringa
. Tada pronađemo koliko ćemo stringova napraviti na taj način. Neka je taj broj
. Primetimo da je
. Takođe primetimo da će nakon toga u podstringu
ostati tačno
stringova
koje možemo iskoristiti za pravljenje stringa
. Tada, ukoliko je
, to znači da moramo da iskoristimo ovaj karakter
da bi od stringa
napravili string
(u suprotnom očigledno uz dosadašnje napravljene stringove i karaktere u podstringu
, nije moguće napraviti dovoljno stringova
), u suprotnom možemo da iskoristimo ovaj karakter da bi napravili string
od stringa
.
Konačno proveravamo da li je broj napravljenih stringova bar
, i ukoliko jeste, vraćamo
, inače
.
Comments