#include"stdio.h" #include"algorithm" #include"vector" #include"assert.h" using namespace std; vector l[18], r[18]; int mat[18][18]; void left(int i, int j, int prefix) { if (i==j) l[i].push_back(prefix^mat[i][j]); else left(i, j-1, prefix^mat[i][j]), left(i+1, j, prefix^mat[i][j]); } void right(int i, int j, int prefix) { if (i==j) r[i].push_back(prefix); else right(i, j+1, prefix^mat[i][j]), right(i-1, j, prefix^mat[i][j]); } struct node { int next[2] = {0, 0}; void fill() { next[0] = next[1] = 0; } } trie[2000000]; int idx ; int insert(int v, int levels) { if (levels == 0) return 0; int p = insert(v>>1, levels-1); int& next = trie[p].next[v&1]; if(next==0) next = ++idx, trie[next].fill(); return next; } int getBest(int v, int levels, int &p) { if(levels == 0) return p=0; int pNode; int val = getBest(v>>1, levels-1, pNode); p = trie[pNode].next[1-(v&1)]; if(p) return val*2+1; p = trie[pNode].next[v&1]; return val*2; } int find(vector l, vector r) { assert(l.size() == r.size()); idx = 0; trie[idx].fill(); for(int i: r) insert(i, 30); int best = 0, temp; for(int i: l) { best = max(best, getBest(i, 30, temp)); } return best; } int main () { int n; scanf("%d", &n); for(int i=0; i