3 Hľadanie reťazcov

Vytvorte konzolovú aplikáciu, ktorá dostane tri pozičné argumenty

  • cestu k textovému súboru (ak súbor neexistuje alebo sa z neho nedá čítať skončite s nenulovým error kódom),

  • neprázdny reťazec znakov X (akceptuje maximálnu dĺžku ostro menšiu 256, pre väčšie reťazce treba skončiť s nenulovým error kódom),

  • číslo N označujúce vzdiatenosť (tu akceptujeme všetky uint32_t okrem nuly, inak nenulový error kód).

Program následne na štandardný výstup vypíše v riadkoch pozície, kde sa nachádza výskyt aký chceme. Prvý znak v súbore má pozíciu 1, nie 0). Whitespace sa ráta do dĺžky súboru a konce riadkov sú vždy jeden znak (teda s tým nemusíte nič robiť, to za vás vyrieši C++).

Hľadáme výskyty reťazca X, ktoré majú vo svojom okolí (definovnom pomocou +-N) ďalší výskyt reťazca X.

Ak máme súbor s obsahom:

1 aaabaaabbbbbbbbaaa

X = aaa a N = 4, tak výsledkom budú pozície 1, 5 . Lebo prvý výskyt má vo vzdialenosti 4 iný výskyt reťazca, konkrétne na pozícií 5 a |5 - 1| <= 4 druhý výskyt tam tiež zarátame, lebo pred ním je vo vzdialenosti 4 ten náš prvý výskyt. Posledný výskyt nepoužijeme, lebo nemá nikde v okolí ešte jeden výskyt.

Ďalšie príklady

X = aaa, N = 2

1 aaaaabbbbbbbaaaaa
1 2 3 4 5 6 1 2 3 13 14 15

V príklade hore sa výskyty prelínajú, ale vôbec nevadí, je tam splnená podmienka blízkosti.


X = aaabaaa, N = 2

1 aaabaaabaaa

Tu bude výstupom nič, síce sa oba stringy prelínajú, ale začiatok prvého je 1 a začiatok druhého je 5 a teda ich rozdiel je väčší ako 2.


Pre vstupný súbor input.txt a X = bbb, N = 20 je výsledok

1 2 3 4 5 6 148 152 265 266 860 865

Súbor môže byť obrovský, pokojne aj niekoľko desiatok GB, takže neukladajte celý jeho obsah do pamäte (pozor na std::get_string). Ako vždy sa hodnotí to aby boli všetky chybové stavy ošetrené (nenulový error kód). Tentokrát sa bonusový body získava za rýchlosť. Čiže aby to aj nejak bežalo. Prvých päť implementácií dostane bonusový bod.