#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O1")
#pragma GCC optimize("O1")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define pb push_back
#define BIT(mask, i) (mask & (1ll << (i)))
const int MAXN = 1e6 + 15;
int N;
int A[MAXN], K[MAXN], dp[MAXN], high[MAXN], low[MAXN];
bool vis1[MAXN], vis2[MAXN];
namespace SubtaskFull {
int ma[1025][1025][22];
vector<int> g1[1025][22];
void SOLVE() {
for (int i = 0; i <= 1023; i++) {
for (int j = 0; j <= 1023; j++) {
if (!vis1[j]) continue;
g1[i][__builtin_popcount(i ^ j)].pb(j);
}
}
int ans = 1;
for (int i = 1; i <= N; i++) {
dp[i] = 1;
if (K[i] <= 20) {
for (int j = max(0, K[i] - 10); j <= min(K[i], 10); j++) {
for (auto e1 : g1[high[i]][j]) {
if (!vis1[e1]) continue;
dp[i] = max(dp[i], ma[e1][low[i]][K[i] - j] + 1);
}
}
}
ans = max(ans, dp[i]);
for (int k = 0; k <= 1023; k++) {
ma[high[i]][k][__builtin_popcount(k ^ low[i])] = max(ma[high[i]][k][__builtin_popcount(k ^ low[i])], dp[i]);
}
}
cout << ans;
}
}
void PROCESS() {
SubtaskFull :: SOLVE();
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("hamming.inp", "r", stdin);
// freopen("hamming.out", "w", stdout);
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> A[i];
int x = 0;
for (int j = 19; j >= 10; j--) {
if (BIT(A[i], j)) x = x * 2 + 1;
else x = x * 2;
}
vis1[x] = true;
high[i] = x;
x = 0;
for (int j = 9; j >= 0; j--) {
if (BIT(A[i], j)) x = x * 2 + 1;
else x = x * 2;
}
vis2[x] = true;
low[i] = x;
}
for (int i = 1; i <= N; i++) {
cin >> K[i];
}
PROCESS();
}