Cod sursa(job #1420539)

Utilizator ButnaruButnaru George Butnaru Data 18 aprilie 2015 17:23:43
Problema Trie Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.55 kb
program triee;
type
trie=^date;
alfabet=array['a'..'z'] of trie;
date=record
x,nr:longint;
f:alfabet;
end;
    pstring=string[25];
    buf=array[0..1 shl 17] of char;
var rad:trie; s:pstring; ff1,ff2:buf;
    i,j,tip:longint; c:char;
    f1,f2:text;
procedure add_trie;
var i:longint; x:trie;
begin
x:=rad;
for i:=1 to length(s) do begin
if x^.f[s[i]]<>nil then begin x:=x^.f[s[i]]; x^.x:=x^.x+1; end else begin
new(x^.f[s[i]]); x:=x^.f[s[i]]; x^.x:=1;
for c:='a' to 'z' do x^.f[c]:=nil;
end; end;
x^.nr:=x^.nr+1;
end;
procedure delete_trie;
var i:longint; x:trie; ok:boolean;
begin
x:=rad; ok:=true;
for i:=1 to length(s) do begin
if x^.f[s[i]]^.x>1 then begin x:=x^.f[s[i]]; x^.x:=x^.x-1; end else
begin x^.f[s[i]]:=nil; ok:=false; break; end;
end;
if ok then x^.nr:=x^.nr-1;
end;
function aparitii:longint;
var i:longint; x:trie;
begin
x:=rad;
for i:=1 to length(s) do
if x^.f[s[i]]=nil then exit(0) else begin
x:=x^.f[s[i]];
if i=length(s) then exit(x^.nr);
end;
end;
function maxprefix:longint;
var i,nr:longint; x:trie;
begin
i:=1; nr:=0; x:=rad;
while (i<=length(s)) and (x^.f[s[i]]<>nil) do begin nr:=nr+1; x:=x^.f[s[i]]; i:=i+1; end;
maxprefix:=nr;
end;
begin
assign (f1,'trie.in');
assign (f2,'trie.out');
reset (f1);
rewrite (f2);
settextbuf(f1,ff1);
settextbuf(f2,ff2);
new(rad);
for c:='a' to 'z' do rad^.f[c]:=nil;
while not eof(f1) do begin
readln (f1,tip,s); delete(s,1,1);
case tip of
0:add_trie;
1:delete_trie;
2:writeln (f2,aparitii);
3:writeln (f2,maxprefix);
end;
end;
close (f1);
close (f2);
end.