Problem:
Score : 600 points

Problem Statement

Given are two sequences a=\{a_0,\ldots,a_{N-1}\} and b=\{b_0,\ldots,b_{N-1}\} of N non-negative integers each.

Snuke will choose an integer k such that 0 \leq k < N and an integer x not less than 0, to make a new sequence of length N, a'=\{a_0',\ldots,a_{N-1}'\}, as follows:

a_i'= a_{i+k \mod N}\ XOR \ x

Find all pairs (k,x) such that a' will be equal to b.

What is \mbox{ XOR }?

The XOR of integers A and B, A \mbox{ XOR } B, is defined as follows:

When A \mbox{ XOR } B is written in base two, the digit in the 2^k's place (k \geq 0) is 1 if either A or B, but not both, has 1 in the 2^k's place, and 0 otherwise.

For example, 3 \mbox{ XOR } 5 = 6. (In base two: 011 \mbox{ XOR } 101 = 110.)

Constraints

1 \leq N \leq 2 \times 10^5

0 \leq a_i,b_i < 2^{30}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
a_0 a_1 ... a_{N-1}
b_0 b_1 ... b_{N-1}

Output

Print all pairs (k, x) such that a' and b will be equal, using one line for each pair, in ascending order of k (ascending order of x for pairs with the same k).

If there are no such pairs, the output should be empty.

Sample Input 1

3
0 2 1
1 2 3

Sample Output 1

1 3

If (k,x)=(1,3),

a_0'=(a_1\ XOR \ 3)=1

a_1'=(a_2\ XOR \ 3)=2

a_2'=(a_0\ XOR \ 3)=3

and we have a' = b.

Sample Input 2

5
0 0 0 0 0
2 2 2 2 2

Sample Output 2

0 2
1 2
2 2
3 2
4 2

Sample Input 3

6
0 1 3 7 6 4
1 5 4 6 2 3

Sample Output 3

2 2
5 5

Sample Input 4

2
1 2
0 0

Sample Output 4

No pairs may satisfy the condition.

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define VRSORT(v) sort(v.begin(), v.end(),[](int a, int b){return a > b;});
#define ALL(X) (X).begin(),(X).end()
#define INF 999999999
#define M_PI 3.14159265358979323846
#define MOD 1000000007

#ifdef __LOCAL
    #define DBG(X) cout << #X << " = " << (X) << endl;
    #define SAY(X) cout << (X) << endl;
#else
    #define DBG(X)
    #define SAY(X)
#endif

#ifdef __LOCAL
    #include <filesystem>
    namespace fs = std::filesystem;
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[]={1, 0, -1, 0, 0};
int dy[]={0, 1, 0, -1, 0};
const int INT_INF = (int)(2e9);
const ll  LL_INF = (ll)(2e18);
const int NIL = -1;
static mt19937 _g(time(nullptr));
 
std::string pad(int num){ char buffer[4]; std::snprintf(buffer, sizeof(buffer), "%03d", num); return buffer;}
inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for (auto el : v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const deque<T>& v) { for (auto el : v) cout << el << " "; return os; }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for (auto& elem : ret) cin >> elem; return ret; }

int N;
// deque<ll> A,B;
vector<ll> A,B;

void input(){
    #ifdef __LOCAL
        fs::path p = __FILE__;
        fs::path input,output;
        input = output = p.parent_path();
        input += string("/input/") + string(p.stem()) + string(".txt");
        output += string("/output/") + string(p.stem()) + string(".txt");
        freopen(input.c_str(), "r", stdin);
        freopen(output.c_str(), "w", stdout);
    #endif
    cin >> N;
    REP(_,N){
        ll a;
        cin >> a;
        A.push_back(a);
    }
    REP(_,N){
        ll b;
        cin >> b;
        B.push_back(b);
    }

}

// deque<ll> next_deq(deque<ll>& X){
//     ll x = X.front();
//     X.pop_front();
//     X.push_back(x);
//     return X;
// }

// bool isAllXorSame(deque<ll> A,deque<ll> B){
//     ll x = A[0]^B[0];
//     for(int i=1;i<N;i++){
//         ll tmp = x;
//         x = A[i]^B[i];
//         if(tmp!=x) return false;
//     }
//     return true;
// }

// int mysolve(){

//     ll ALLX = 0LL;
//     for(auto a:A) ALLX ^= a;
//     for(auto b:B) ALLX ^= b;
//     if((N%2==0)&(ALLX!=0)) return 0;

//     REP(k,N){
//         if(isAllXorSame(A,B)){
//             cout << k << " " << (A[0]^B[0]) << "\n";
//         }
//         next_deq(A);
//     }
//     return 0;
// }

template<typename T>
vector<int> z_algorithm(const T &s) {
    vector<int> ans(s.size());
    ans[0] = s.size();
    int i = 1, j = 0;
    while (i < (int)s.size()) {
        while (i + j < (int)s.size() && s[j] == s[i + j]) ++j;
        ans[i] = j;
        if (!j) {
            ++i;
            continue;
        }
        int k = 1;
        while (i + k < (int)s.size() && k + ans[k] < j) ans[i + k] = ans[k], ++k;
        i += k;
        j -= k;
    }
    return ans;
}

int solve(){
    vector<ll> zalg;
    for (int i = 0; i < N; i++)
    {
        zalg.push_back(B[i]^B[(i+1)%N]);
    }
    for (int i = 0; i < N; i++)
    {
        zalg.push_back(A[i]^A[(i+1)%N]);
    }
    for (int i = 0; i < N; i++)
    {
        zalg.push_back(A[i]^A[(i+1)%N]);
    }
    auto zz=z_algorithm(zalg);
    vector<ll> res;
    for (int i = N; i < 2*N; i++)
    {
        if(zz[i]>=N){
           ll k=i-N;
           res.push_back(k);
        }
    }
    for(auto k:res){
        ll x = A[k]^B[0];
        cout << k << " " << x << endl;
    }
    return 0;
}

int main()
{
    input();
    solve();
    // vector<int> T={1,2,2,3,1,5,4,2,1,1,2,2,3,2,1,1,3};
    // string s="adfasdfewoiralkjfdklsjflkajsdklfjslkadjfoiwnmef,kndsklnfkjashbndvdkjahslkfjhlkjawe";
    // DBG(z_algorithm(T));
    // DBG(z_algorithm(s));
    return 0;
}