Evo vam source od programa writing sa IOI-a.
Che nemoj tako stvarno nemam vremena, a upravom sam
instaliro bds(Borland developer studio) 2006 architect
pa moram po njemu da prckam.
Uradio sam u Delphi-u, da kompalirare sa FreePascal-om
direktivu {$APPTYPE CONSOLE} promjenite u {$mode objfpc}
a
uses
SysUtils;
izbrisite.
Uradio sam ovo jutros u sest sati pa se nadam da je uredu.
Uglavnom ce te shvatiti bit. Moze se ubrzati da sequece
ucitava iz datoteke po podatak kad zatreba ali to prepustam
vama. Puno jednostavnije je u uraditi u c++ ali sam uspio
oboriti LINUX

i to neko mora. Che rekao si da postavimo
resenja svih zadataka. Mislim da bi bolje bilo da ispisemo
ideju resavanja pa da svatko po tome radi, a source cemo
stavljati samo ako bas moramo. Zadatci sa IOI-a su stvarno
teski ali ce mo uspjeti zajedno rijesiti.
Jutros kad sam radio i nece nikako da izbaci dobro. Deset
minuta se J**em kad ono umjesto Last := i + Glyph_Len; ja
stavio Last := j + 1;.
MEXICO ne bi trebao isto biti tezak ali neznam dok nepocnem
RADITI. Treba koristi graf i alogoritam MINIMALNO DRVO
RAZAPINJANJA kojem treba postaviti uslov da se kod krajneg
grafa ivice ne sjeku.
PS. Je li iko radio u bds 2006. Stvarno je super za razliku
od mog starog Delphi-a 7(Ali isto jako dobrog). Mnogo su
usavrsili debuger.Novi Ide je dobar ali drazi mi je stari.
Editor je fantastican.
Kod:
program writing;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TOneData = record
Have : boolean;
Count : integer;
end;
var
Glyph : array[65..122] of TOneData;
Sequence : array[1..3000000] of integer;
Glyph_Len : integer;
Sequence_Len : longint; i : integer;
procedure LoadData(FileName : string);
var
fText : TextFile;
i : integer;
TempChar : Char;
begin
AssignFile(fText, FileName);
Reset(fText);
Readln(fText, Glyph_Len, Sequence_Len);
for i := 1 to Glyph_Len do
begin
Read(fText, TempChar);
Glyph[Ord(TempChar)].Have := true;
Inc(Glyph[Ord(TempChar)].Count)
end;
Readln(fText, TempChar); // Uklanjamo #13
for i := 1 to Sequence_Len do
begin
Read(fText, TempChar);
Sequence[i] := Ord(TempChar);
end;
CloseFile(fText);
end;
procedure Add(Sender : integer);
begin
if Glyph[Sender].Have then
Inc(Glyph[Sender].Count);
end;
function DoWriting : integer;
var
Last, First : integer;
i, j : integer;
check : boolean;
begin
Last := 1;
First := 0;
Result := 0;
for i := 1 to Sequence_Len - Glyph_Len + 1 do
begin
if First > i then
begin
Add(Sequence[i]);
continue;
end;
Check := true;
for j := Last to i + Glyph_Len - 1 do
begin
if not Glyph[Sequence[j]].Have then
begin
Last := j + 1;
First := Last;
Check := false;
Break;
end;
if Glyph[Sequence[j]].Count = 0 then
begin
Last := j;
Check := false;
Break;
end;
Dec(Glyph[Sequence[j]].Count);
end;
if Check then
begin
Inc(Result);
Last := i + Glyph_Len;
end;
Add(Sequence[i]);
end;
end;
procedure SaveData(Filename : string);
var
fText : TextFile;
begin
AssignFile(fText, FileName);
Rewrite(fText);
Writeln(fText, DoWriting);
CloseFile(fText);
end;
begin
LoadData('writing.in');
SaveData('writing.out');
end.