版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/81510432
题目链接:http://codeforces.com/contest/1013/problem/B
题意: 给你N个数和一个X,每次你可以选一个数改变这个数(让这个数与x进行&(按位与)运算)。这个操作可以进行任意次,问至少将几个数进行按位与运算才能使得至少有两个数相等,注意:如果生产后的数和原来一样,那么只算一个。
思路:一共就四个答案-1,0,1,2。
- -1:无解
- 0 :N个数中本来就有两个数相同(无需再进行运算)
- 1 :N个数中其中一个数与x进行&(按位与)运算,出现两个数相等
- 2 :N个数中两个数都与x进行&(按位与)运算,使得这两个数相等
还有就是:一个数无论与另一个数进行多少次&操作得出的数是相同的(也就是最多进行一次&操作)
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
set<int>s,s1;
int a[200000],x,n;
int main()
{
cin>>n>>x;
for(int i = 1; i <= n; i++)
{
int t;
cin>>a[i];
if(s.count(a[i])){puts("0"); return 0;}
s.insert(a[i]);
}
for(int i = 1; i <= n; i++)
{
s.erase(a[i]);
if(s.count(a[i]&x)){puts("1"); return 0;}
s.insert(a[i]);
}
for(int i = 1; i <= n; i++)
{
if(s1.count(a[i]&x)){puts("2"); return 0;}
s1.insert(a[i]&x);
}
puts("-1");
}