Cod sursa(job #963605)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 17 iunie 2013 21:21:28
Problema Trie Scor 5
Compilator fpc Status done
Runda Arhiva educationala Marime 2 kb
program trie;
  type arbore=^celula;
       celula=record
                info,trec:longint;
                alf:array ['a'..'z'] of arbore;
              end;
  var tr,r:arbore;
      op:byte;
      c:char;
      s:ansistring;
      bufin,bufout:array [1..100000] of byte;

procedure adauga(s:ansistring);
  var r,q:arbore;
      i:longint;
  begin
    q:=tr;
    for i:=1 to length(s) do
      begin
        if q^.alf[s[i]]=nil then
          begin
            new(r);
            r^.info:=0;
            r^.trec:=0;
            q^.alf[s[i]]:=r;
          end;
        q:=q^.alf[s[i]];
        inc(q^.trec);
      end;
    inc(q^.info);
  end;

procedure sterge(s:ansistring);
  var q:arbore;
      i:longint;
  begin
    q:=tr;
    for i:=1 to length(s) do
      begin
        q:=q^.alf[s[i]];
        dec(q^.trec);
      end;
    dec(q^.info);
  end;

function numaparitii(s:ansistring):longint;
  var q:arbore;
      i:longint;
      ok:boolean;
  begin
    q:=tr;  ok:=true;
    for i:=1 to length(s) do
      begin
        if ok then
          begin
            q:=q^.alf[s[i]];
            if q= nil then ok:=false;
          end;
      end;
    if ok then numaparitii:=q^.info
          else numaparitii:=0;
  end;

procedure prefix(s:ansistring);
  var q:arbore;
      i,l:longint;
      ok:boolean;

  begin
    q:=tr;l:=length(s);
    i:=1; ok:=true;
    while (q^.alf[s[i]]<>nil)and ok and(i<l)do
      begin
        q:=q^.alf[s[i]];
        if q^.trec>0 then inc(i)
                     else ok:=false;
      end;
    writeln(i-1);
  end;

begin
  assign(input,'trie.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'trie.out');
  rewrite(output);
  settextbuf(output,bufout);

  new(tr);
  tr^.info:=0;
  while not eof do
    begin
      readln(op,c,s);
      case op of
        0: adauga(s);
        1: sterge(s);
        2: writeln(numaparitii(s));
        3: prefix(s);
        end;
    end;
  close(output);
end.