【題目敘述】http://codeforces.com/contest/1205/problem/B
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, dis[130][130], g[130][130];
long long x, a[100005];
int main() {
cin >> n;
int cnt = 0;
for (int i = 0; i < n; i++){
cin >> x;
if (x) a[++cnt] = x;
}
if (cnt > 128){
cout << 3;
return 0;
}
n = cnt;
memset(dis, 0x3F, sizeof(dis));
memset(g, 0x3F, sizeof(g));
for (int i = 1; i <= n; i++){
for (int j = i+1; j <= n; j++){
if ((a[i]&a[j])){
dis[i][j] = 1;
dis[j][i] = 1;
g[i][j] = 1;
g[j][i] = 1;
}
}
}
int ans = 10005;
for (int k = 1; k <= n; k++){
for (int i = 1; i <= n; i++){
if (i == k) continue;
for (int j = i+1; j <= n; j++){
if (j == k) continue;
if (g[k][i] < 105 && g[k][j] < 105 && dis[i][j] < 10000){
ans = min(ans, g[k][i]+g[k][j]+dis[i][j]);
}
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (dis[i][k]+dis[k][j] < dis[i][j]) dis[i][j] = dis[i][k]+dis[k][j];
}
}
}
if (ans == 10005) cout << -1;
else cout << ans << "\n";
}