G - WiFi Password
Gym - 101608G
代码语言:javascript复制&:以前学过的,又忘记了。 从左往右枚举,如果发现当前的 sum 值大于了 m ,就 break 。然后从当前位置开始向前求 “或”,初始化一下 sum , 然后让左端点开始的位置是 sum > m 的位置,进行下一次比较。这样左端点就是往后移了。
#include <bits/stdc .h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 10;
int a[maxn];
int main()
{
int t,n,m,i,j;
freopen("wifi.in", "r", stdin);
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
for(i = 0; i < n; i )
{
scanf("%d", &a[i]);
}
int Max = -1;
int len = 0;
int res = 0;
int sum = 0;
for(i = 0; i < n;)
{
sum = 0;
len = 0;
for(j = i; j < n; j )
{
sum |= a[j];
len ;
if(sum > m) break;
res = max(res,len);
}
if(j >= n) break;
sum = 0;
for(; j >= 0; j --)
{
sum |= a[j];
if(sum > m) break;
}
i = j 1;
}
printf("%dn",res);
}
return 0;
}