Cod sursa(job #1525502)

Utilizator ili226Vlad Ilie ili226 Data 15 noiembrie 2015 09:57:20
Problema Trie Scor 5
Compilator fpc Status done
Runda Arhiva educationala Marime 2.09 kb
{$r-}
type nd=^nod;
     nod=record
          nrlit,nrcuv:longint;
          next:array[1..26]of nd
         end;
     cuvant=string[20];
var f,fo:text;
    s:cuvant;
    tip,i:byte;
    trie,p:nd;
procedure adauga(poz:byte;w:cuvant;var t:nd);
var p:nd;{ord(w[poz])-ord('a')+1}
    k,i:byte;

begin
 if poz<=length(w)then
  begin
   inc(poz);
   k:=ord(w[poz])-ord('a')+1;
   if t=nil then
    begin
     new(p);
     p^.nrlit:=1;
     p^.nrcuv:=0;
     if poz=length(w)+1 then p^.nrcuv:=1;
     for i:=1 to 26 do
      p^.next[i]:=nil;
     t:=p;
    end
            else
    begin
     inc(t^.nrlit);
     if poz=length(w)+1 then inc(t^.nrcuv)
    end;
   adauga(poz,w,t^.next[k])
  end;
end;

procedure sterge(poz:byte;w:cuvant;var t:nd);
var k:byte;
    p,pp:nd;
begin
if poz<=length(w)then
 begin
  dec(t^.nrlit);
  if poz=length(w) then dec(t^.nrcuv);
  inc(poz);
  k:=ord(w[poz])-ord('a')+1;
  if poz<=length(w)then sterge(poz,w,t^.next[k]);
  if t^.nrlit=0 then
   begin
    dispose(t);
    t:=nil;
   end;
 end;
end;

procedure numara(poz:byte;w:cuvant;var t:nd);
var p:nd;
    k:byte;
begin
 p:=t;
 if p<>nil then
  begin
   while poz<>length(w) do
    begin
     inc(poz);
     k:=ord(w[poz])-ord('a')+1;
     p:=p^.next[k];
    end;
   writeln(fo,p^.nrcuv);
  end
           else
  writeln(fo,0);
end;

procedure prefix(poz:byte;w:cuvant;var t:nd);
var p:nd;
    k,j:byte;
begin
j:=0;
p:=t;
while (p<>nil)and(poz<=length(w)) do
 begin
  inc(j);
  inc(poz);
  k:=ord(s[poz])-ord('a')+1;
  p:=p^.next[k];
 end;
writeln(fo,j);
end;

begin
new(p);
p^.nrlit:=0;
p^.nrcuv:=0;
for i:=1 to 26 do
 p^.next[i]:=nil;
trie:=p;
assign(f,'trie.in');
assign(fo,'trie.out');
reset(f);
rewrite(fo);
while not eof(f) do
 begin
  readln(f,tip,s);
  delete(s,1,1);
  case tip of
   0:adauga(1,s,trie^.next[ord(s[1])-ord('a')+1]);
   1:sterge({1}0,s,trie{^.next[ord(s[1])-ord('a')+1]});
   2:numara(1,s,trie^.next[ord(s[1])-ord('a')+1]);
   3:prefix(1,s,trie^.next[ord(s[1])-ord('a')+1]);
  end
 end;
close(fo);
close(f);
end.