辉哥喜欢异或 - 题目 - CQUPT Online Judge
题目描述
辉哥非常喜欢异或运算,因为异或有一些非常奇妙的性质
现在辉哥有一个长度为的n数组a和一个整数x,每次他可以从数组中选择一个元素ai并把它替换成ai^x,其中^代表按位异或运算
现在辉哥想知道,他至少需要几次操作可以得到两个相同元素,请你写一个程序来帮助他。
如果无论经过几次操作都无法满足要求,请尽情嘲讽他,输出huige is so vegetable!
输入格式
第一行输入一个整数n和一个整数x,以空格隔开,分别代表数组的大小和参与异或运算的数x
接下来一行输入个数n,a1, a2, a3, ......,an以空格隔开,代表数组中的每个元素
输出格式
如果经过若干次操作可以得到两个相同元素,则输出一个整数ans表示答案,否则输出huige is so vegetable!
样例
样例输入1
5 2
1 2 3 4 5
样例输出1
1
样例输入2
5 2
1 2 3 4 1
样例输出2
0
思路:
我这里使用到了set进行去重,如果在进行运算时出现相同的数字时则整个在set中数组的长度将减小,与数组长度len比较,如果出现减小,则说明出现了相同的数字
利用异或(^ 异或 两个位相同为0,相异为1)的性质,结果只可能为0,1,impossible
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int N = 100010;
set<int> st;
int n, x;
int a[N], b[N];
int main() {
cin >> n >> x;
for (int i = 1; i <= n; i++) {
cin >> a[i];
st.insert(a[i]); //将每个数放入set中
}
int len = st.size(); //set最开始的长度
bool flag = false;
if (len < n) //如果有重复
cout << 0; //直接输出0
else {
for (int i = 1; i <= n; i++) {
b[i] = a[i] ^ x; //对每个a[i]进行异或操作
st.insert(b[i]); //在装入set中
len++; //每次让数组的长度++
//如果长度不同
if (st.size() != len) {
flag = true;
break;
}
}
if (flag) //如果出现了相同的数字
cout << 1;
else
cout << "huige is so vegetable!";
}
return 0;
}