Vedúci KSP boli na chate. Ako tak pripravovali nové zadania, poriadne im vyhladlo. Čakali, čakali a ešte dlhšie čakali, keď zrazu Dušan dostal geniálny nápad. Rozhodol sa, že si spolu s vedúcimi pôjdu ten obed uloviť. A tak vedúci išli do lesa s nádejou, že sa konečne budú môcť poriadne najesť.
V lese pobudli celkom dlhý čas, avšak nenašli nič, čo by sa dalo uloviť a zjesť. Po chvíli vyšli na lúku s vysokou trávou. Tam konečne zahliadli niečo, čo by si mohli uloviť. V tráve sa totiž hemžilo mnoho hadov rôznych dĺžok. A tak sa vedúci miesto lovenia si obedu pustili do hádania sa, kto z nich vidí hadov akej dĺžky. Pomôž vedúcim zistiť, aký je súčet dĺžok hadov v tráve, skôr, ako ich vedúci svojím krikom vyplašia.
Na vstupe dostanete postupnosť rôznych znakov. Naším cieľom je
spočítať súčet dĺžok všetkých hadov v tráve. Had sa skladá z hlavičky
~O dĺžky 1 (jazyk nepočítame), tela pozostávajúceho zo
znakov =, pričom každý znak má dĺžku 1 (pozor, had môže mať
aj telo dĺžky 0), a chvostíka > dlžky 1. Všetky hady sú
orientované rovnakým smerom, a to takým, že vľavo sa nachádza hlavička a
vpravo chvostík.
Vstup je reťazec dĺžky $N$.
V jednotlivých sadách platia nasledujúce obmedzenia:
| Sada | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| $1 \leq N \leq$ | $500$ | $10\,000$ | $100\,000$ | $10^6$ |
Vypíš jeden riadok a v ňom jedno celé číslo, ktoré zobrazuje súčet dĺžky hadov.
Input:
~O==>~O>
Output:
6
V tomto prípade sú v tráve $2$ hady, prvý má dĺžku $4$ a druhý $2$. Súčet ich dĺžok je teda $6$.
Input:
~O===8>
Output:
0
V tomto prípade v tráve nevidíme žiadne hady.
Na začiatok si musíme uvedomiť, že had pozostáva z
hlavičky ~O, tela tvoreného znakom = a
chvostíka >. Teda medzi hlavičkou a chvostíkom sa musia
nachádzať iba znaky =, inak to nie je had. Taktiež vieme,
že všetky hady sú orientované rovnakým smerom, a to takým, že hlavička
je vždy naľavo od chvostíka.
Teda nám stačí prejsť reťazec z ľava do prava, a vždy, keď nájdeme hlavičku hada, pamätať si, že sme v tele hada a počítať jeho dĺžku, až kým nenarazíme na chvostík alebo iný znak. Ak nájdeme chvostík, stačí nám pripočítať dĺžku daného hada k celkovému súčtu dĺžok hadov, ak nájdeme iný znak, pokračujeme v hľadaní hlavičky.
Časová zložitosť je $O(n)$, lebo prechádzame celým reťazcom iba raz.
Pamäťová zložitosť je $O(1)$, lebo si program pamätá iba niekoľko premenných - súčet dĺžok hadov a premennú, ktorá kontroluje, či sa práve nachádzame v hadovi alebo nie. Vzorový python kód má pamäťovú zložitosť $O(n)$, pretože načítava celý rad do pamäte. Vzorový C++ kód má pamäťovú zložitosť $O(1)$, pretože načítava iba jeden znak naraz. Na vyriešenie úlohy za plný počet bodov stačí implementácia s pamäťovou zložitosťou $O(n)$.
Korešpondenčný seminár z programovania zastrešuje občianske združenie Trojsten.
Trojsten, o.z.
FMFI UK, Mlynská dolina
842 48 Bratislava
Programátorská súťaž pre základoškolákov
Materiály a úlohy na výučbu programovania
Intenzívny programátorský zážitok v lete