classlfs { public: lfs(int N) { memset(head, -1, sizeof head); ecnt = 0; n = N; } voidadde(int from, int to){ e[ecnt].to = to; e[ecnt].next = head[from]; head[from] = ecnt++; } voidaddde(int a, int b){ // clog << "adding edge" << a << b << endl; adde(a, b); adde(b, a); }
intsolve(){ memset(dep, 0, sizeof dep); memset(vis,false,sizeof vis); ans = INF; for (int i = 1; i <= 64; i++) { if (cnt[i] >= 3) { return3; } } for (int i = 1; i <= n; i++) { if (!vis[i]) dfs(i, 0, 1); } return (ans < INF) ? (ans / 2) : -1; }
protected: structEdge { int to, next; } e[MAXN * 64 * 2]; int head[MAXN]; int ecnt; int n;
int ans; int dep[MAXN]; bool vis[MAXN];
voiddfs(int u, int fa, int d){ dep[u] = d; vis[u] = true; for (int i = head[u]; i != -1; i = e[i].next) { int v = e[i].to; if (v != fa) { if (vis[v]) { int len = abs(dep[u] - dep[v]) + 1; if (len > 4) { ans = min(ans, len + 1); } } else { dfs(v, u, d + 1); } } } } };
int64 a[MAXN];
#include<cctype> #include<cstdio>
template <typename T = int> inline T read() { T X = 0, w = 0; char ch = 0; while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); } while (isdigit(ch)) { X = (X << 3) + (X << 1) + (ch ^ 48); ch = getchar(); } return w ? -X : X; }
intmain(){ int n = read(); auto graph = newlfs(n + 64); for (int i = 1; i <= n; i++) { a[i] = read<int64>(); for (int64 j = 1; j <= 64; j++) { if ((a[i] >> (j - 1)) & 1) { graph->addde(i, n + j); cnt[j]++; } } } cout << graph->solve() << endl; return0; }