program uprava_ucebnice; type ptUZEL = ^tUZEL; pPREKLAD = ^string; tUZEL = record preklad: pPREKLAD; potomci: array['A'..'Z'] of ptUZEL; end; var i, N: longint; koren: tUZEL; znak: char; ve_slove: boolean; slovo: string; preklad: string; vstup: text; vystup: text; { Pomocná funkce pro snažší manipulaci s konci řádků } procedure cti_znak(var vstup: text; var znak: char); begin if eoln(vstup) then begin znak := #10; { Nový řádek vrátí jako znak #10 a přejde na nový řádek } Readln(vstup); end else Read(vstup, znak); end; procedure inicializuj_trii(var koren: tUZEL); var znak: char; begin for znak := 'A' to 'Z' do koren.potomci[znak] := nil; koren.preklad := nil; end; procedure vloz_do_trie(var koren: tUZEL; var klic, hodnota: string); var i: integer; znak: char; uzel: ptUZEL; begin uzel := @koren; for i := 1 to length(klic) do begin znak := klic[i]; if uzel^.potomci[znak] <> nil then { Pokud potomek existuje, přejdeme tam } uzel := uzel^.potomci[znak] else begin { Neexistující potomky vytváříme } new(uzel^.potomci[znak]); uzel := uzel^.potomci[znak]; for znak := 'A' to 'Z' do { Inicializace nového uzlu } uzel^.potomci[znak] := nil; uzel^.preklad := nil; end; end; new(uzel^.preklad); uzel^.preklad^ := hodnota; end; function najdi_v_trii(var koren: tUZEL; var klic, hodnota: string): boolean; var i: integer; znak: char; uzel: ptUZEL; begin najdi_v_trii := False; uzel := @koren; for i := 1 to length(klic) do begin znak := klic[i]; if uzel^.potomci[znak] <> nil then { Buď existuje příslušný potomek } uzel := uzel^.potomci[znak] else { nebo slovo ve slovníku nebylo } exit; end; if uzel^.preklad = nil then exit; hodnota := uzel^.preklad^; najdi_v_trii := True; end; procedure smaz_uzel(uzel : ptUZEL); var znak : char; begin if uzel<>nil then begin for znak:='A' to 'Z' do smaz_uzel(uzel^.potomci[znak]); { Rekurzivně smažeme celý strom } dispose(uzel); end; end; procedure smaz_trii(var koren : tUZEL); { Odstraní trii z paměti } var znak : char; begin for znak:='A' to 'Z' do smaz_uzel(koren.potomci[znak]); end; begin Assign(vstup, 'ucebnice.in'); Reset(vstup); Assign(vystup, 'ucebnice.out'); Rewrite(vystup); Readln(vstup, N); inicializuj_trii(koren); for i := 1 to N do begin slovo := ''; Read(vstup, znak); while znak <> ' ' do begin { Přidáme slovo do trie } slovo := slovo + znak; Read(vstup, znak); end; Readln(vstup, preklad); vloz_do_trie(koren, slovo, preklad); end; slovo := ''; ve_slove := False; while not eof(vstup) do begin { Čteme až do konce souboru } cti_znak(vstup, znak); if znak in ['A'..'Z'] then begin if ve_slove then begin { Pokud jsme ve slově, ... } slovo := slovo + znak; { ... přidáme k němu další znak } end else begin { Jinak začneme nové slovo } slovo := znak; end; ve_slove := True; end else begin if ve_slove then begin { Na konci slova } if najdi_v_trii(koren, slovo, preklad) then Write(vystup, preklad) { vypíšeme buď náhradu slova } else Write(vystup, slovo); { nebo původní slovo } end; if znak <> #10 then Write(vystup, znak) else Writeln(vystup); ve_slove := False; end; end; if ve_slove then begin { Soubor skončil slovem } if najdi_v_trii(koren, slovo, preklad) then Write(vystup, preklad) else Write(vystup, slovo); end; smaz_trii(koren); close(vstup); close(vystup); end.