题目地址 题意:给你一个序列,然后m次查询,每次查询告诉你一个下标,然后你输出除了这个下标的数以外的所有数字的与,或,异或的结果。 思路:与,或的结果通过前缀和后缀的思想可以一次计算得到,然而异或的结果因为自己异或自己得到的结果就是0,所以只要整个序列的异或再异或那个下标的数就好了。(详细看代码,很好理解的)
#include <iostream> #include <cstring> #include <string> #include <queue> #include <vector> #include <map> #include <set> #include <stack> #include <cmath> #include <cstdio> #include <algorithm> #include <iomanip> #define N 100010 #define M 60010 #define Q 300010 #define LL __int64 #define inf 0x3f3f3f3f #define lson l,mid,ans<<1 #define rson mid+1,r,ans<<1|1 #define getMid (l+r)>>1 #define movel ans<<1 #define mover ans<<1|1 using namespace std; const LL mod = 1000000007; int num[N]; int and1[N],and2[N],or1[N],or2[N],xorsum; int main() { cin.sync_with_stdio(false); int n,m; while(cin>>n>>m){ xorsum=0; for(int i=1;i<=n;i++){ cin>>num[i]; xorsum^=num[i]; } and1[2]=num[1]; or1[2]=num[1]; for(int i=3;i<=n;i++){ and1[i]=and1[i-1]&num[i-1]; or1[i]=or1[i-1]|num[i-1]; } and2[n-1]=num[n]; or2[n-1]=num[n]; for(int i=n-2;i>0;i--){ and2[i]=and2[i+1]&num[i+1]; or2[i]=or2[i+1]|num[i+1]; } int k; for(int i=0;i<m;i++){ cin>>k; if(k==1){ cout<<and2[k]<<" "<<or2[k]<<" "<<(xorsum^num[k])<<endl; } else if(k==n){ cout<<and1[k]<<" "<<or1[k]<<" "<<(xorsum^num[k])<<endl; } else cout<<(and1[k]&and2[k])<<" "<<(or1[k]|or2[k])<<" "<<(xorsum^num[k])<<endl; } } return 0; }