Cod sursa(job #382279)

Utilizator cristi12345Balu Cristian cristi12345 Data 13 ianuarie 2010 11:38:46
Problema Xor Max Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.23 kb
  var a:array[1..20000000] of longint;
     b:array[0..22] of longint;
     st,dr,z,i,x,y,n,max,j:longint;
     f,g:text;

 procedure fill;
 var poz:longint;
 begin
   poz:=1;
   for j:=b[0] downto 2 do begin
   poz:=poz shl 1+b[j];
   a[poz]:=-1;
   end;
   poz:=poz shl 1+b[1];
   a[poz]:=i;
  end;

 procedure caut;
 var poz,i:longint;
 begin
   poz:=1;
   for i:=b[0] downto 1 do begin
   if a[(poz shl 1)+(b[i] xor 1)]<>0 then begin
   y:=y shl 1+b[i] xor 1;
   poz:=(poz shl 1)+(b[i] xor 1);
   end
   else begin
    y:=y shl 1+b[i];
    poz:=poz shl 1+b[i];
   end;
  end;
  z:=a[poz];
  end;

 begin
  assign(f,'xormax.in'); reset(f);
  assign(g,'xormax.out'); rewrite(g);
  read(f,n);
  read(f,x);
  y:=x; b[0]:=21; i:=1;
  for j:=1 to b[0] do begin
   b[j]:=y and 1;
   y:=y shr 1;
  end;
  max:=x; st:=1; dr:=1;
  fill;
  for i:=2 to n do begin
   read(f,y);
   x:=x xor y;
  y:=x;
   for j:=1 to b[0] do begin
    b[j]:=y and 1;
    y:=y shr 1;
   end;
   y:=0;
   caut;
   if x xor y>max then begin
    max:=x xor y;
    st:=z;
    dr:=i;
   end;
   fill;
  end;
  if st=dr then
   writeln(g,max,' ',st,' ',dr)
  else
   writeln(g,max,' ',st+1,' ',dr);
  close(f); close(g);
end.