Cod sursa(job #18632)

Utilizator pelaspateSorin Fagateanu pelaspate Data 18 februarie 2007 12:51:03
Problema Reguli Scor 30
Compilator fpc Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.56 kb
{$q-,r-,s-,d-,i-}
const maxn=500*1000;zero=ord('0');baza=1000*1000*1000;
var t:Text;
    V:array[0..maxn]of int64;
    Sol:array[0..maxn]of longint;
    p1,p2,i,j,n,lg,p:longint;s:string;
    nr:array[0..2]of longint;
{var t1:longint;t2:longint absolute $0:$046c;}
begin
{   t1:=t2;}
   assign(t,'reguli.in');reset(t);readln(t,n);
   for i:=1 to N do
   begin
      readln(t,S);p:=1;lg:=0;fillchar(nr,sizeof(nr),0);
      for j:=length(s) downto 1 do
      begin
         nr[lg]:=nr[lg]+p*(ord(s[j])-zero);
         p:=p*10;if p=baza then begin p:=1;inc(lg);end;
      end;
      if nr[2]=0 then V[i]:=int64(nr[1])*baza+nr[0] else
      V[i]:=(int64(nr[2])*baza+nr[1])*baza+nr[0];
   end;close(T);
   for i:=1 to N do begin Sol[i]:=i;V[i]:=V[i+1]-v[i];end;dec(n);
   i:=2;
   while i<=N do
   begin
      p1:=0;p2:=i-1;
      while (V[p1+1]=V[p2+1])and(p1+1<i)and(p2<i*2)and(p2<N) do
      begin
         inc(p1);inc(p2);
         if Sol[i-1]=p2-i+1 then
         begin
            Sol[p2]:=sol[i-1];break;
         end else
         if p2=N then
         begin
            {cauta intre p1+1si i-1 cel mai mic sol}
            sol[n]:=Sol[i-1];
            while sol[n]<(N-i+1) do inc(sol[n],sol[i-1]);
            if sol[n]>n then sol[n]:=n;
         end;
       end;
       if p2=i-1 then inc(i) else i:=p2+1;
   end;
{   for i:=1 to N do writeln(V[i],' ',Sol[i]);}
             {reguli.in}
   assign(t,'reguli.out');rewrite(T);writeln(t,sol[N]);
   for i:=1 to Sol[n] do writeln(t,v[i]);
   close(t);
{   writeln((t2-t1)/18.2:0:6);}
end.