Pagini recente » Cod sursa (job #279503) | Cod sursa (job #1720820) | Cod sursa (job #2937515) | Cod sursa (job #632787) | Cod sursa (job #1525502)
{$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.