Description:
N頭の牛が、一列に並んでいる。(1<=N<=10万)
牛にはK種類の属性があり、全ての牛は各属性に対して真か偽かの値を持っている。(1 <= K <= 30)
次のような牛の集合をbalancedと呼ぶ : 各属性において、その属性が真となっている牛の数が等しくなっている。
全部の牛の属性の情報が与えられるので、balancedな連続した部分列で、最も長いものの長さを求めよ。
Answer:
各属性の牛の数を、属性1の牛の数との差分で持った情報を、属性情報と呼ぶ事にする。
先頭からx頭目までの部分列について属性情報を計算し、属性情報からその値を取りえる最小のxを対数時間で求められるようソートしておく。
後は、y頭目から最後までの部分列の属性情報を計算し、x+1頭目からy-1頭目までの部分列がbalancedになるようなxまでの属性情報を計算し、はじめの配列を見るだけ。
計算時間はO(N*K*log(N))
Source: