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.

Author: milisav

Prvo ćemo preračunati sledeće dve vrednosti: ge[i] i e[i], koje označavaju koliko možemo najviše podsekvenci ge uzeti iz podstringa S[i:N] i koliko slova e, koje nismo iskoristili za neki stringova ge, postoji u tom podstringu. Primetimo da je rešenje binarno pretraživo, tj. ukoliko možemo da pronađemo t podsekvenci \texttt{algoge}, onda sigurno mozemo da pronadjemo i x podsekvenci za svako x \leq t. Binarno pretražujemo po rešenju i proveravamo da li je moguće pronaći x podsekvenci \texttt{algoge} u stringu. Sada prolazimo kroz string i pamtimo koliko smo do sada "napravili" stringova \texttt{a}, \texttt{al}, \texttt{alg}, \texttt{algo}, \texttt{algog} i \texttt{algoge}.

Delimo na slučajeve po vrednosti trenutnog karaktera:

  • S[i] \notin \{'a','l','g','o','e'\} - Nastavljamo na sledeći karakter.
  • S[i] = 'a' - Povećamo broj napravljenih stringova \texttt{a} za 1.
  • S[i] = 'l' - Ukoliko broj napravljenih stringova \texttt{a} nije 0, povećamo broj napravljenih stringova \texttt{al} za 1 i smanjimo broj napravljenih stringova \texttt{a} za 1.
  • S[i] = 'o' - Ukoliko broj napravljenih stringova \texttt{alg} nije 0, povećamo broj napravljenih stringova \texttt{algo} za 1 i smanjimo broj napravljenih stringova \texttt{alg} za 1.
  • S[i] = 'e' - Ukoliko broj napravljenih stringova \texttt{algog} nije 0, povećamo broj napravljenih stringova \texttt{algoge} za 1 i smanjimo broj napravljenih stringova \texttt{algog} za 1.
  • S[i] = 'g' - Ukoliko nema napravljenih stringova \texttt{al} ni napravljenih stringova \texttt{algo}, nastavljamo na sledeći karakter. Ukoliko nema napravljenih stringova \texttt{al}, povećamo broj napravljenih stringova \texttt{algog} za 1 i smanjimo broj napravljenih stringova \texttt{algo} za 1. Ukoliko nema napravljenih stringova \texttt{algo}, povećamo broj napravljenih stringova \texttt{alg} za 1 i smanjimo broj napravljenih stringova \texttt{al} za 1. Ostaje slučaj u kojem postoje napravljeni i string \texttt{al} i string \texttt{algo}, tj. možemo da biramo za koji ćemo string iskoristiti trenutni karakter. Neka je p broj napravljenih stringova \texttt{algoge}. Primetimo da ćemo za sve napravljene stringove \texttt{algog} (neka je broj takvih stringova t) iskoristiti neko e iz podstringa S[i+1:N]. Tada pronađemo koliko ćemo stringova napraviti na taj način. Neka je taj broj q. Primetimo da je q = min(e[i+1]+ge[i+1],t). Takođe primetimo da će nakon toga u podstringu S[i+1:N] ostati tačno r = min(e[i+1]+ge[i+1]-q,ge[i+1]) stringova \texttt{ge} koje možemo iskoristiti za pravljenje stringa \texttt{algoge}. Tada, ukoliko je p+q+r < x, to znači da moramo da iskoristimo ovaj karakter 'g' da bi od stringa \texttt{algo} napravili string \texttt{algog} (u suprotnom očigledno uz dosadašnje napravljene stringove i karaktere u podstringu S[i+1:N], nije moguće napraviti dovoljno stringova \texttt{algoge}), u suprotnom možemo da iskoristimo ovaj karakter da bi napravili string \texttt{alg} od stringa \texttt{al}.

Konačno proveravamo da li je broj napravljenih stringova \texttt{algoge} bar x, i ukoliko jeste, vraćamo \texttt{true}, inače \texttt{false}.


Comments

There are no comments at the moment.