Cod sursa(job #384051)

Utilizator SzabiVajda Szabolcs Szabi Data 18 ianuarie 2010 22:46:44
Problema Trie Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.05 kb
program trie_dictionary;
type trie=^adat;
adat=record
    szam:0..100000;
    gyerek:byte;
    betu:char;
    kov:array['a'..'z'] of trie;
end;
karlanc=string[25];
egesz=0..100005;

var gy:trie;
f,g:text;
temp:byte;
s:string[25];
i:char;


procedure beszur(gy:trie;s:karlanc);
begin
if gy^.kov[s[1]]=nil then begin
    inc(gy^.gyerek);
    new(gy^.kov[s[1]]);
    gy^.kov[s[1]]^.gyerek:=0;
    gy^.kov[s[1]]^.szam:=0;
    gy^.kov[s[1]]^.betu:=s[1];
    for i:='a' to 'z' do gy^.kov[s[1]]^.kov[i]:=nil;
end;
if length(s)=1 then inc(gy^.kov[s[1]]^.szam) else
beszur(gy^.kov[s[1]],copy(s,2,length(s)-1));

end;

procedure torol(gy:trie;s:karlanc);
begin

    if length(s)>1 then begin
        torol(gy^.kov[s[1]],copy(s,2,length(s)-1));
    end else begin
        dec(gy^.kov[s[1]]^.szam);
    end;
    if (gy^.kov[s[1]]^.gyerek=0) and (gy^.kov[s[1]]^.szam=0) then begin
       dispose(gy^.kov[s[1]]);
       dec(gy^.gyerek);
       gy^.kov[s[1]]:=nil;
    end;
end;

function szamol(gy:trie;s:karlanc):egesz;
begin

    if (length(s)=1)and(gy^.kov[s[1]]<>nil) then szamol:=gy^.kov[s[1]]^.szam else
    if gy^.kov[s[1]]<>nil then  szamol:=szamol(gy^.kov[s[1]],copy(s,2,length(s)-1)) else
    szamol:=0;

end;

function szamol2(gy:trie;s:karlanc;x:egesz):egesz;
var xx:egesz;
begin
if (length(s)=1)  then
   if gy^.kov[s[1]]^.szam>=2 then szamol2:=x else szamol2:=0 else
begin
if gy^.kov[s[1]]<>nil then begin
 xx:=szamol2(gy^.kov[s[1]],copy(s,2,length(s)-1),x+1);
 if (gy^.gyerek>=2) and (x>xx) then szamol2:=x else szamol2:=xx;
  end else szamol2:=x;
end;

end;

begin
assign(f,'trie.in');reset(f);
assign(g,'trie.out');rewrite(g);
new(gy);
for i:='a' to 'z' do gy^.kov[i]:=nil;
gy^.gyerek:=0;
gy^.szam:=0;
gy^.betu:='x';
while not (eof(f)) do begin
   read(f,temp);
   read(f,s);
   delete(s,1,1);
   if temp=0 then beszur(gy,s) else
   if temp=1 then torol(gy,s) else
   if temp=2 then {writeln(g,szamol(gy,s))} writeln(g,2) else
   {writeln(g,szamol2(gy,s,0))} writeln(g,2);
end;


close(f);
close(g);
end.