大意
给定
n
n
n个数,求连续长度不小于
k
k
k的最大按位或和按位与值
思路
按位或的最大值其实就是所有数或起来,因为
a
o
r
b
>
=
a
a\ or\ b>=a
a or b>=a 按位与的最大值其实就是
k
k
k个数与起来,因为
a
a
n
d
b
<
=
a
a\ and\ b<=a
a and b<=a
所以我们只需要用位运算维护一个动态窗口即可
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std
;int n
,k
,ans2
,ans1
,now
,a
[1000001],v
[1000001];
signed main()
{
scanf("%d%d",&n
,&k
);
for(register int i
=1;i
<=n
;i
++)
{
scanf("%d",a
+i
);
for(register int j
=0;j
<32;j
++)
v
[j
]+=(a
[i
]>>j
)&1;
if(i
>=k
)
{
int now
=0;
for(register int j
=0;j
<32;j
++)
{
v
[j
]-=(a
[i
-k
]>>j
)&1;
now
+=(1<<j
)*(v
[j
]==k
);
}
if(now
>ans2
)ans2
=now
;
}
ans1
|=a
[i
];
}
printf("%d %d",ans1
,ans2
);
}