#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct pozicija
{
    int poz_i;
    int poz_j;

}; // vraca prvu i poslednju poziciju

int main()
{
    int n; // duzina nizova
    unsigned int a, b; // elementi nizova

    vector<unsigned int> prvi_niz; // u tekstu to je A niz
    vector<unsigned int> drugi_niz; // u tekstu to je B niz
    vector<vector<unsigned int>> podnizovi; // vector sa podnizovima nizova
    vector<pozicija> poz_podnizova; // pozicije podnizova treb azbog mnozenja na kraju

    vector<int> vrednosti_xor; // vrednosti xor-a
    vector<int> vrednosti_and; // vrednosti and-a
    vector<int> pomnozena_vrednost; // i za kraj mnozenje

    cin >> n; // unos duzine

    for (int i = 0; i < n; ++i){
       cin >> a;
       prvi_niz.push_back(a); // punjenje vectora A
    }

    for (int i = 0; i < n; ++i){
       cin >> b;
       drugi_niz.push_back(b); // punjenje vectora B
    }

    for (int i = 0; i < n; ++i){
       for (int j = i+1; j < n; ++j){
          vector<unsigned int> podniz; // vector sa podnizovima
          for (int k = i; k <= j; ++k){
             podniz.push_back(prvi_niz[k]); // punjenje podnizova
          }
          podnizovi.push_back(podniz); // svi podnizovi
       }
    }

    pozicija l; // uzimam vrednosti i posle ubacujem u for petlju
    l.poz_i = 0;
    l.poz_j = 0;

    for (const auto& podniz : podnizovi){
       unsigned int prvi = podniz[l.poz_i]; // uzimam prvi element za pocetni

       for (size_t i = l.poz_i+1; i < podniz.size(); ++i){
          l.poz_j = i;
          prvi = (prvi^podniz[l.poz_j]);
          vrednosti_xor.push_back(prvi); // punjenje vectora sa xor vrednostima(ovo radi ispravno)
          poz_podnizova.push_back(l); // punjenje vectora pozicijama(ovde imam problem za sad)
       }
       l.poz_i++; // radi
    }

    for (const auto& l : poz_podnizova){
       unsigned int drugi = drugi_niz[l.poz_i];

       for (int poc = l.poz_i+1; poc <= l.poz_j; ++poc){
          drugi = (drugi&drugi_niz[poc]); // radi zbog iznad for petlje i indexa
          vrednosti_and.push_back(drugi);
       }
    }

    for (size_t i = 0; i < vrednosti_xor.size(); ++i){
       pomnozena_vrednost.push_back(vrednosti_xor[i] * vrednosti_and[i]);
    }

    auto najveci = max_element(pomnozena_vrednost.begin(), pomnozena_vrednost.end());

    cout << *najveci << endl;

    return 0;
}