这也是个水题,基本上都很简单,想想就出来了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define N 100005
using namespace std;
typedef long long LL;
int T, n, m, a[N], x[N][30];
LL solve()
{
memset(x, 0, sizeof(x));
LL ret = 0;
for(int i = 0, j = 0, s = 0; i < n; ++i)
{
if(a[i] >= m) continue;
j = max(i, j);
while(j < n && (s|a[j]) < m)
{
s |= a[j];
for(int k = 0; k < 30; ++k)
{
if(j-1>=0)
x[j][k] = x[j-1][k];
if((1<<k)&a[j])
x[j][k]++;
}
j++;
}
ret += j-i;
for(int k = 0; k < 30; ++k)
if((1<<k)&a[i])
x[j-1][k]--;
s = 0;
for(int k = 0; k < 30; ++k)
if(x[j-1][k])
s |= (1<<k);
}
return ret;
}
int main(int argc, char **argv)
{
scanf("%d", &T);
for(int cas = 1; cas <= T; ++cas)
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i)
scanf("%d", a+i);
printf("Case #%d: %I64d\n", cas, solve());
}
return 0;
}