hdu3949

来源:互联网 发布:劳丽诗开淘宝店的经历 编辑:程序博客网 时间:2024/06/04 08:06

第一次线性基~~~~裸替。。。

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;ll base[70];ll ansbase[70];ll a[10010];int kind = 0;int t, n, q;const ll l = 1;ll sh(ll a, int b){for (int i = 1; i <= b; i++)a /= 2;return a;}void getbase(ll a){bool judge = false;for (int i = 60; i >= 0; i--){ll temp = a >> i;if (temp & 1){if (base[i] == 0){base[i] = a;judge = 1;break;//易错点!!!!}elsea ^= base[i];}}if (!judge)kind = 1;}void clearr(){for (int i = 0; i <= 60; i++){if (base[i] == 0)continue;for (int k = 60; k >= i + 1; k--){ll temp = base[k]>>i;if (temp & 1){base[k] ^= base[i];}}}}ll getans(ll q, ll stdd, int all){if (q>stdd)return -1;if (q == 0)return 0;ll temp = 0;for (int i = 0; i < all; i++){if ((q>>i) & 1){temp ^= ansbase[i];}}return temp;}int main(){scanf("%d", &t);//  ll aa=1;//for(int i=1;i<=60;i++)//aa*=2;//cout<<aa<<endl;int k = 1;while (t--){scanf("%d", &n);kind = 0;for (int i = 0; i <= 60; i++)base[i] = 0;for (int i = 1; i <= n; i++)scanf("%I64d", &a[i]), getbase(a[i]);clearr();int all = 0;ll stdd = 1;for (int i = 0; i <= 60; i++)if (base[i]){ansbase[all++] = base[i];}stdd <<= all;stdd -= 1;scanf("%d", &q);printf("Case #%d:\n", k++);for (int i = 1; i <= q; i++){ll que;scanf("%I64d", &que);que -= kind;printf("%I64d\n", getans(que, stdd, all));}}return 0;}

原创粉丝点击