#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
mt19937 rng(time(0));
const int N=2e5+50,lg=18,LG=31;
int A[N],B[N],n,pref[N];
ll res;
int LOG[N+50],AND[N][lg+1];
int And(int l,int r){int i=LOG[r-l+1];return AND[l][i]&AND[r-(1<<i)+1][i];}
int root[N+50],nc,go[N*LG][2],maxind[N*LG];
void Update(int &c,int c1,int x,int ind,int i){
	c=++nc;go[c][0]=go[c1][0],go[c][1]=go[c1][1];maxind[c]=max(maxind[c1],ind);
	if(i==-1) return;
	int bit=(x>>i)&1;
	Update(go[c][bit],go[c1][bit],x,ind,i-1);
	//printf("%i %i\n",c,go[c][0]);
	//printf("%i %i\n",c,go[c][1]);
}
int Get(int c,int x,int lo,int i){
	if(i==-1) return 0;
	int bit=(x>>i)&1;//printf("%i: %i %i %i %i\n",i,bit,c,maxind[go[c][0]],maxind[go[c][1]]);
	if(maxind[go[c][1-bit]]>=lo) return (1<<i)+Get(go[c][1-bit],x,lo,i-1);
	return Get(go[c][bit],x,lo,i-1);
}
void Solve(){
	for(int i=1;i<=n;i++) AND[i][0]=B[i];
    for(int j=0;j<lg;j++){
		for(int i=1;i<=n;i++){
			if(i+(1<<j)>n) break;
			AND[i][j+1]=AND[i][j]&AND[i+(1<<j)][j];
		}
    }
    for(int i=0;i<=n;i++){
		pref[i+1]=pref[i]^A[i+1];
		Update(root[i+1],root[i],pref[i],i+1,LG);
    }
    for(int i=1;i<=n;i++){
		//Update(root,1,n,1,i,A[i]);
		for(int j=i;j>=1;j--){
			int l=1,r=j,ind=j;ll val=And(j,i);
			while(l<=r){
				int mid=l+r>>1;
				if(And(mid,i)==val){ind=mid;r=mid-1;}
				else l=mid+1;
			}
			//ll x=Get(root,1,n,ind,j);
			ll x=Get(root[j+1],pref[i],ind,LG);
			//printf("\n");
			//printf("%i %i: %lld\n",ind,j,x);
			res=max(res,x*val);
			j=ind;
		}
    }
    //printf("%lld\n",res);
}

ll res1;
void Bruteforce(){
	for(int i=1;i<=n;i++){
		for(ll j=i,nesto1=0,nesto2=B[i];j>=1;j--){
			nesto1^=A[j],nesto2&=B[j];
			res1=max(res1,nesto1*nesto2);
		}
	}
}
bool nadjen;
void Uporedi(){
	if(res!=res1){
		printf("%i\n",n);
		for(int i=1;i<=n;i++) printf("%i ",A[i]);printf("\n");
		for(int i=1;i<=n;i++) printf("%i ",B[i]);printf("\n");
		printf("%lld %lld\n",res,res1);
		nadjen=true;
	}
}
void Gen(){
	for(int i=0;i<=n;i++) A[i]=B[i]=0;n=0;
	n=rng()%100+1;int veliko=1000000000;
	for(int i=1;i<=n;i++) A[i]=rng()%veliko;
	for(int i=1;i<=n;i++) B[i]=rng()%veliko;
}
void CLEAR(){
	res=0;
	for(int i=0;i<=n+5;i++) for(int j=0;j<=lg;j++) AND[i][j]=0;
	for(int i=0;i<=n+5;i++) A[i]=B[i]=pref[i]=root[i]=0;
	for(int i=0;i<=nc+5;i++) go[i][0]=go[i][1]=maxind[i]=0;nc=0;
	res1=0;
}
int main(){
	for(int i=1,e=1,ct=-1;i<=N;i++){if(i==e){e<<=1,ct++;}LOG[i]=ct;}
    scanf("%i",&n);for(int i=1;i<=n;i++) scanf("%i",&A[i]);for(int i=1;i<=n;i++) scanf("%i",&B[i]);
    //while(!nadjen){Gen();Solve();Bruteforce();Uporedi();CLEAR();}
    //Bruteforce();printf("%lld\n",res1);
    Solve();printf("%lld\n",res);
    return 0;
}