牛客练习赛26:D-xor序列(线性基)
题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y
题解:线性基
#include <bits/stdc++.h> using namespace std; const double EPS = 1e-6; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; const int maxn = 1e2 + 10; int n, q; long long p[maxn]; int main() { scanf("%d", &n); for(long long i = 0, x; i < n; i++){ scanf("%lld", &x); for(int j = 40; j >= 0; j--){ if(x >> j){ if(!p[j]){ p[j] = x; break; } x ^= p[j]; } } } for(int i = 0; i < 40; i++) cout<<p[i]<<" ";cout<<endl; scanf("%d", &q); long long x, y; while(q--){ scanf("%lld%lld", &x, &y); x ^= y; for(int j = 40; j >= 0; j--){ if(x >> j) x ^= p[j]; } if(x) puts("NO"); else puts("YES"); } return 0; }