XOR Zero
2016-06-28 14:54
309 查看
题目描述
给出N个整数,求能否从这N个整数中取出任意个数(至少选一个数),使他们的XOR值等于0?输入
多组数据。每组数据第一行为一个整数N。(N<=100)
之后一行中有N个整数A[i]。(A[i]<2^63)
输出
对于每组数据,如果能够找到这样的集合,输出”YES”,否则输出”NO”。
样例输入
31 2 3
1
0
3
3 5 7
2
1 1
样例输出
YESYES
NO
YES
#include <iostream> using namespace std; typedef long long ll; const ll maxn = 105; const ll mod = 10000000007; ll n; ll s[maxn]; void input() { for (ll i = 0; i < n; ++i) scanf("%lld", &s[i]); } //xor高斯消元求线性基 //复杂度O(30n) ll xorGauss(ll n) { ll row = 0; for (ll i = 64; i >= 0; i--) { ll j; for (j = row; j < n; j++) if (s[j] & (1ll << i)) break; if (j != n) { swap(s[row], s[j]); for (j = 0; j < n; j++) { if (j == row) continue; if (s[j] & (1ll << i)) s[j] ^= s[row]; } row++; } } // for (ll j = 0; j < n; ++j) { // cout << s[j] << ", "; // } return row; } void GetR() { ll row; ll answer; row = xorGauss(n); answer = n - row; if (answer >0) { printf("YES\n"); } else { printf("NO\n"); } } int main() { //while (scanf("%lld", &n)) while (cin >>n) { input(); GetR(); } return 0; }
xor一般都要想到用高斯消元,这道题目重点就是如何高斯消元取得目标矩阵,从而得出结果,笔者之前试过很多方法,测试过很多数据,个人感觉是对的,但是就是不给过,宝宝想哭,参考大神做法,学以致用~。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法