Cod sursa(job #308733)

Utilizator mlazariLazari Mihai mlazari Data 28 aprilie 2009 12:52:33
Problema Trie Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.97 kb
Program Trie;
type ptr=^tr;
     tr=record
       cnt,nf : longint;
       f : array['a'..'z'] of ptr;
     end;
     cuvant=string[20];
var Intrare,Iesire : text;
    p : ptr;

procedure DeschideFisiere;
begin
  assign(Intrare,'trie.in');
  assign(Iesire,'trie.out');
  reset(Intrare);
  rewrite(Iesire);
end;

function nou : ptr;
var q : ptr;
    i : char;
begin
  new(q);
  q^.cnt:=0;
  q^.nf:=0;
  for i:='a' to 'z' do q^.f[i]:=nil;
  nou:=q;
end;

procedure adauga(w : cuvant);
var q : ptr;
    i,l : byte;
begin
  q:=p;
  l:=length(w);
  for i:=1 to l do begin
    if q^.f[w[i]]=nil then q^.f[w[i]]:=nou;
    q^.nf:=q^.nf+1;
    q:=q^.f[w[i]];
  end;
  q^.cnt:=q^.cnt+1;
end;

procedure sterge(w : cuvant);
var q : ptr;
    i,l : byte;
begin
  q:=p;
  l:=length(w);
  for i:=1 to l do begin
    q^.nf:=q^.nf-1;
    if q^.f[w[i]]<>nil then
     if (i<l) and (q^.f[w[i]]^.nf=1) or
        (i=l) and (q^.f[w[i]]^.cnt=1) then begin
       q^.f[w[i]]:=nil;
       exit;
     end;
    q:=q^.f[w[i]];
  end;
  q^.cnt:=q^.cnt-1;
end;

function nrcuv(w : cuvant) : longint;
var q : ptr;
    i,l : byte;
begin
  l:=length(w);
  q:=p;
  for i:=1 to l do begin
    q:=q^.f[w[i]];
    if q=nil then break;
  end;
  if q=nil then nrcuv:=0 else nrcuv:=q^.cnt;
end;

function lunpref(w : cuvant) : byte;
var q : ptr;
    i,l : byte;
begin
  l:=length(w);
  i:=0;
  q:=p;
  while (q^.f[w[i+1]]<>nil) and (i<l) do begin
    i:=i+1;
    q:=q^.f[w[i]];
  end;
  lunpref:=i;
end;

procedure Proceseaza;
var op : byte;
    sp : char;
    w : cuvant;
begin
  p:=nou;
  while not eof(Intrare) do begin
    readln(Intrare,op,sp,w);
    case op of
      0: adauga(w);
      1: sterge(w);
      2: writeln(Iesire,nrcuv(w));
      3: writeln(Iesire,lunpref(w));
    end;
  end;
end;

procedure InchideFisiere;
begin
  close(Intrare);
  close(Iesire);
end;

begin
  DeschideFisiere;
  Proceseaza;
  InchideFisiere;
end.