Cod sursa(job #848102)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 4 ianuarie 2013 20:39:48
Problema Trie Scor 15
Compilator fpc Status done
Runda Arhiva educationala Marime 1.92 kb
program trie_;
  type trie=^celula;
       celula=record
                info,info2:longint;
                alf:array ['a'..'z'] of trie;
              end;
  var f1,f2:text;
      t:trie;
      op:byte;
      s:string;
      c:char;
      bufin,bufout:array[1..100000] of byte;
procedure zero;
  var i:byte;
      r,q:trie;
  begin
    i:=1; r:=t;
    while i<=length(s) do
      begin
        if r^.alf[s[i]] = nil then begin
                                     new(q);
                                     q^.info:=0; q^.info2:=0;
                                     for c:='a' to 'z' do q^.alf[c]:=nil;
                                     r^.alf[s[i]]:=q;
                                   end;
        r:=r^.alf[s[i]];
        inc(r^.info2);
        inc(i);
      end;
    inc(r^.info);
  end;

procedure one;
  var i:byte;
      r:trie;
      b:boolean;
begin
  i:=1;r:=t;
  while i<=length(s) do
    begin
      b:=true;
      r:=r^.alf[s[i]];
      dec(r^.info2);
      inc(i);
    end;
  dec(r^.info);
end;

procedure two;
  var i:byte;
      r:trie;
begin
  i:=1; r:=t;
  while (i<=length(s)) and (r<>nil) do begin r:=r^.alf[s[i]];  inc(i); end;
  if r=nil then writeln(f2,0)
           else writeln(f2,r^.info);
end;

procedure three;
  var i:byte;
      r:trie;
  begin
    i:=1;r:=t;
    while (r^.info2<>0)and(r^.alf[s[i]]<>nil) do
      begin
        r:=r^.alf[s[i]];
        inc(i);
      end;
    dec(i);
    if r^.info2=0 then dec(i);
    writeln(f2,i);
  end;
begin
  assign(f1,'trie.in');
  reset(f1);
  assign(f2,'trie.out');
  rewrite(f2);
  settextbuf(f1,bufin);
  settextbuf(f2,bufout);
  new(t);t^.info:=0;t^.info2:=1;
  for c:='a' to 'z'do t^.alf[c]:=nil;
  while not eof(f1) do
    begin
      readln(f1,op,c,s);
      case op of
        0:zero;
        1:one;
        2:two;
        3:three;
      end;
    end;
  close(f1);
  close(f2);
end.