链接地址https://www.nowcoder.com/acm/contest/156/C
思路很简单,只需要枚举最高位,且低位都为0即可,容易错的是忘记判断低位,我第一次写的时候就忘了。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
const int maxn =1e5+5 ;
using namespace std ;
typedef long long ll ;
ll inp[maxn];
int main(){
int n ;
scanf("%d",&n);
for(int i = 0 ;i< n ; i++)
scanf("%lld",&inp[i]);
vector<ll> ans ;
for(int i = 30;i>= 0; i--){
int m = 1<<i ; int mm = m-1;
for(int j = 0 ; j < n ; j++)
if(inp[j]&m) {
ans.push_back(inp[j]);
mm= mm&inp[j];
}
if(mm==0){
if(ans.size()>0){
cout<<ans.size()<<endl;
for(int j = 0 ;j< ans.size();j++){
printf("%lld",ans[j]);
if(j!=ans.size()-1)
printf(" ");
else printf("\n");
}
}
else printf("-1\n");
break ;
}
ans.clear();
}
return 0;
}