| 比赛 | 
    20120711 | 
    评测结果 | 
    AAAAAAAAAAAA | 
    | 题目名称 | 
    平衡奶牛 | 
    最终得分 | 
    100 | 
    | 用户昵称 | 
    IMSL77 | 
    运行时间 | 
    0.705 s  | 
    | 代码语言 | 
    Pascal | 
    内存使用 | 
    28.70 MiB  | 
    | 提交时间 | 
    2012-07-11 11:57:52 | 
显示代码纯文本
program balline;
type
  integer=longint;
const
  maxn=110000;
  maxk=31;
var
  n,k:integer;
  root,tot:integer;
  a:array[1..maxn] of integer;
  sum:array[0..maxn,1..maxk] of integer;
  cow:array[0..maxn,1..maxk] of integer;
  left,right:array[1..maxn] of integer;
  key:array[1..maxn] of integer;
  pro:array[0..maxn] of real;
  procedure Fopen;
  begin
    assign(input,'balline.in'); reset(input);
    assign(output,'balline.out'); rewrite(output);
  end;
  procedure Fclose;
  begin
    close(input); close(output);
  end;
  procedure Init;
  var
    i:integer;
  begin
    readln(n,k);
    for i:=1 to n do read(a[i]);
  end;
  procedure ClearTreap;
  begin
    fillchar(left,sizeof(left),0);
    fillchar(right,sizeof(right),0);
    root:=0; tot:=0;
    pro[0]:=2;
  end;
  function equal(x,y:integer):boolean;
  var
    i:integer;
  begin
    for i:=1 to k do if cow[x,i]<>cow[y,i] then exit(false);
    exit(true);
  end;
  function less(x,y:integer):boolean;
  var
    i:integer;
  begin
    for i:=1 to k do
    begin
      if cow[x,i]<cow[y,i] then exit(true);
      if cow[x,i]>cow[y,i] then exit(false);
    end;
    exit(false);
  end;
  function Search(root,x:integer):integer;
  begin
    if root=0 then exit(-1);
    if equal(x,key[root]) then exit(key[root]);
    if less(x,key[root]) then exit(Search(left[root],x))
                         else exit(Search(right[root],x));
  end;
  procedure Left_Rotate(var k:integer);
  var
    t:integer;
  begin
    t:=right[k]; right[k]:=left[t];
    left[t]:=k; k:=t;
  end;
  procedure Right_Rotate(var k:integer);
  var
    t:integer;
  begin
    t:=left[k]; left[k]:=right[t];
    right[t]:=k; k:=t;
  end;
  procedure Insert(var root:integer; x:integer);
  begin
    if root=0 then
    begin
      inc(tot); root:=tot;
      key[root]:=x; pro[root]:=random;
      exit;
    end;
    if less(x,key[root]) then
    begin
      Insert(left[root],x);
      if pro[left[root]]<pro[root] then Right_Rotate(root);
    end else
    begin
      Insert(right[root],x);
      if pro[right[root]]<pro[root] then Left_Rotate(root);
    end;
  end;
  procedure Solve;
  var
    i,j:integer;
    ans:integer;
  begin
    fillchar(sum,sizeof(sum),0);
    for i:=1 to n do
      for j:=1 to k do
      begin
        sum[i,j]:=sum[i-1,j];
        if a[i] and (1 shl (j-1))>0 then inc(sum[i,j]);
      end;
    fillchar(cow,sizeof(cow),0);
    for i:=0 to n do
      for j:=1 to k-1 do
        cow[i,j]:=sum[i,j+1]-sum[i,j];
    dec(k);
    ClearTreap;
    ans:=0;
    for i:=0 to n do
    begin
      j:=Search(root,i);
      if j>-1 then begin if i-j>ans then ans:=i-j; end
      else Insert(root,i);
    end;
    writeln(ans);
  end;
begin
  Fopen;
  Init;
  Solve;
  Fclose;
end.