Pagini recente » Cod sursa (job #745462) | Cod sursa (job #2667155) | Cod sursa (job #2595771) | Cod sursa (job #65982) | Cod sursa (job #308735)
Cod sursa(job #308735)
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;
if q<>nil then 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.