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