Pagini recente » Cod sursa (job #486252) | Cod sursa (job #3125552) | Cod sursa (job #43884) | Cod sursa (job #1527048) | Cod sursa (job #480009)
Cod sursa(job #480009)
program trie_;
type
PTrie = ^TTrie;
TTrie = record
f : array['a'..'z'] of PTrie;
n : longword;
nr : longword;
end;
var fej : PTrie;
procedure Create( var x:PTrie );inline;
var c:char;
begin
new(x);
for c:='a' to 'z' do
x^.f[c] := nil;
x^.n :=0;
x^.nr :=0;
end;
procedure Add( s:string );inline;
var l,i:byte;
p:PTrie;
begin
l := length(s);
p := fej;
i := 1;
while i <= l do
begin
inc( p^.nr );
if p^.f[s[i]]=nil then Create(p^.f[s[i]]);
p := p^.f[s[i]];
inc(i);
end;
inc(p^.n);
inc(p^.nr);
end;
function getN( s:string; var i:byte ):longword;inline;
var l:byte;
p:PTrie;
begin
l := length(s);
i := 1;
p := fej;
while i <= l do
begin
if p=nil then
begin
getN := 0;
exit;
end;
p := p^.f[s[i]];
inc(i);
end;
if p <> nil then getN := p^.n
else getN := 0;
end;
procedure Remove( s:string );inline;
var l:byte;
function remove_rek( const p:PTrie;const i:byte ):boolean;
var b:boolean;
begin
if i = l+1 then
begin
dec( p^.n );
end
else
begin
b := remove_rek( p^.f[ s[i] ] , i+1 );
if b then
begin
dispose( p^.f[s[i]]);
p^.f[s[i]] := nil;
end;
end;
dec( p^.nr );
remove_rek := p^.nr = 0;
end;
begin
l:= length(s);
if remove_rek( fej,1 ) then
begin
dispose( fej^.f[s[1]] );
fej^.f[s[1]] := nil;
end;
end;
var c,c2:char;
s:string;
i:byte;
begin
Create(fej);
assign(input, 'trie.in');
reset(input);
assign(output, 'trie.out');
rewrite(output);
while not eof(input) do
begin
read(c,c2);
readln(s);
case c of
'0': Add(s);
'1': Remove(s);
'2': writeln( getN(s,i) );
'3': begin
getN(s,i);
writeln(i-2);
end;
end;
end;
close(output);
end.