求一个最长子序列,使得这个序列相邻两项按位与不为0。
显然我们可以n^2枚举转移。
但是这题要求相邻相邻按位与不为0即可。我们可以设f[i]表示最后一项第i位为1的最长子序列长度,每次加入一个数字的时候更新f数组。可以做到(O(N))
const int N = 1e5 + 79;
int n;
int a[N];
int f[37];
int ans(0);
int main() {
read(n);
rep(i, 1, n) {
read(a[i]);
}
rep(i, 1, n) {
int mx(1);
rep(bit, 0, 30) {
if((a[i] >> bit) & 1) mx= max(mx, f[bit] + 1);
}
rep(bit,0,30){
if((a[i] >> bit) & 1) f[bit]= max(mx, f[bit]);
}
}
out(*std::max_element(f,f+30+1), '
');
return 0;
}