HDU 6186 && 2017广西邀请赛:CS Course
程序员文章站
2022-06-04 15:36:26
...
n个数,m次查询,每次给出一个p,求出除了第p个数以外其它所有数的且和,或和,异或和
统计下每个二进制位1的数量,例如z[5] = x表示有x个数第5个二进制位为1
之后每次查询只要check一下z[]就好
#include<stdio.h>
#include<string.h>
int a[100005], z[32];
int main(void)
{
int n, q, p, i, j, ans;
while(scanf("%d%d", &n, &q)!=EOF)
{
memset(z, 0, sizeof(z));
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
for(i=1;i<=n;i++)
{
for(j=0;j<=30;j++)
{
if(a[i]&(1<<j))
z[j]++;
}
}
while(q--)
{
scanf("%d", &p);
ans = 0;
for(i=0;i<=30;i++)
{
if(z[i]==n || z[i]==n-1 && (a[p]&(1<<i))==0)
ans |= (1<<i);
}
printf("%d", ans);
ans = 0;
for(i=0;i<=30;i++)
{
if(z[i]>=2 || z[i]==1 && (a[p]&(1<<i))==0)
ans |= (1<<i);
}
printf(" %d ", ans);
ans = 0;
for(i=0;i<=30;i++)
{
if(z[i]%2==0 && a[p]&(1<<i) || z[i]%2 && (a[p]&(1<<i))==0)
ans |= (1<<i);
}
printf("%d\n", ans);
}
}
return 0;
}