http://acm.hdu.edu.cn/showproblem.php?pid=6186
给定你一组数,
在给你q个查询,
每个查询问你 除了当前的数,其他数组中所有数的 与 或 异或 值
异或是有反操作的。
对于 &和| , 我是通过维护一个前缀和后缀。
比方说,在计算a_i 的时候,输出 1-a_i-1 和a_(i+1)-a_n的与 和或
前缀和可以输入的时候维护,后缀和再扫一遍。
#include <bits/stdc++.h>
using namespace std;
int a[100050],ans1[100050],ans2[100050],ans3[100050];
struct Node
{ int x,y;
}node[100050],node2[100050];
int main()
{
int n,p,x;
while(scanf("%d%d",&n,&p)!=-1)
{
scanf("%d",&a[1]);
node[0].x=0xffffffff;
node[n+1].y=0xffffffff;
// cout<<node[0].x<<endl;
node2[0].x=0;
node2[n+1].y=0;
node[1].x=a[1];int c=a[1],d=a[1];
//node[1].y=a[1];
node2[1].x=a[1];
for(int i=2;i<=n;i++)
{
scanf("%d",&a[i]);
node[i].x=a[i]&node[i-1].x;
node2[i].x=a[i]|node2[i-1].x;
c=c|a[i];
d=d^a[i];
}
node[n].y=a[n];
node2[n].y=a[n];
for(int i=n-1;i>=1;i--){
node[i].y=node[i+1].y&a[i];
node2[i].y=node2[i+1].y|a[i];}
//for(int i=0;i<=n;i++){
// cout<<node[i].x<<" "<<node[i].y<<endl;
// }
for(int i=0;i<p;i++)
{
scanf("%d",&x);
ans1[i]=node[x-1].x&node[x+1].y;
//cout<<node[x-1].x<<" "<<node[x+1].y<<endl;
ans2[i]=node2[x-1].x|node2[x+1].y;
ans3[i]=d^a[x];
}
for(int i=0;i<p;i++)
printf("%d %d %d\n",ans1[i],ans2[i],ans3[i]);
}
return 0;
}