Problem p02816 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

// std::vector Declaration
template <typename T> vector<T> make_v(size_t a) { return vector<T>(a); }
template <typename T, typename... Ts> auto make_v(size_t a, Ts... ts) {
  return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}

// std::vector Declaration and Initialization
template <typename T> vector<T> make_vector(size_t a, T x) {
  return vector<T>(a, x);
}
template <typename T, typename U, typename... Ts>
auto make_vector(size_t a, U b, Ts... ts) {
  return vector<decltype(make_vector<T>(b, ts...))>(a,
                                                    make_vector<T>(b, ts...));
}

// std::vector Input
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &e : v)
    is >> e;
  return is;
}

// std::vector Debug
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  bool a = 1;
  for (auto e : v) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "]";
  return os;
}

// std::array Debug
template <typename T, size_t n>
ostream &operator<<(ostream &os, const array<T, n> &v) {
  os << "[";
  bool a = 1;
  for (auto e : v) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "]";
  return os;
}

// std::deque Debug
template <typename T> ostream &operator<<(ostream &os, const deque<T> &d) {
  os << "[";
  bool a = 1;
  for (auto e : d) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "]";
  return os;
}

// std::pair Debug
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << " " << p.second << ")";
  return os;
}

// std::set Debug
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) {
  os << "{";
  bool a = 1;
  for (auto e : st) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "}";
  return os;
}

// std::multiset Debug
template <typename T> ostream &operator<<(ostream &os, const multiset<T> &st) {
  os << "{";
  bool a = 1;
  for (auto e : st) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "}";
  return os;
}

// std::map Debug
template <typename T, typename U>
ostream &operator<<(ostream &os, const map<T, U> &mp) {
  os << "{";
  bool a = 1;
  for (auto e : mp) {
    os << (a ? "" : " ");
    os << e.first << ":" << e.second;
    a = 0;
  }
  os << "}";
  return os;
}

// std::tuple Debug
template <int N, class Tuple> void out(ostream &os, const Tuple &t) {}
template <int N, class Tuple, class H, class... Ts>
void out(ostream &os, const Tuple &t) {
  if (N)
    os << " ";
  os << get<N>(t);
  out<N + 1, Tuple, Ts...>(os, t);
}
template <class... Ts> ostream &operator<<(ostream &os, const tuple<Ts...> &t) {
  os << "(";
  out<0, tuple<Ts...>, Ts...>(os, t);
  os << ")";
  return os;
}

// Debug
#define DUMP(x) cerr << #x << " = " << (x) << endl

// Weighted edge
template <typename T> struct edge {
  int src, to;
  T cost;

  edge(int to, T cost) : src(-1), to(to), cost(cost) {}
  edge(int src, int to, T cost) : src(src), to(to), cost(cost) {}

  friend ostream &operator<<(ostream &os, const edge &e) {
    return os << "(" << e.src << "->" << e.to << ":" << e.cost << ")";
  }
};

using LL = long long;

#define fs first
#define sc second

const LL MOD = 1e9 + 7;

struct RollingHash {
  const int base = 9973;
  const int mod[2] = {999999937, 1000000007};
  vector<int> s;
  vector<LL> hash[2], pow[2];

  RollingHash(const vector<int> &cs) : s(cs) {
    int n = s.size();
    for (int id = 0; id < 2; ++id) {
      hash[id].assign(n + 1, 0);
      pow[id].assign(n + 1, 1);
      for (int i = 0; i < n; ++i) {
        hash[id][i + 1] = (hash[id][i] * base + s[i]) % mod[id];
        pow[id][i + 1] = pow[id][i] * base % mod[id];
      }
    }
  }

  // get hash of s[l:r)
  LL get(int l, int r, int id = 0) {
    LL res = hash[id][r] - hash[id][l] * pow[id][r - l] % mod[id];
    if (res < 0)
      res += mod[id];
    return res;
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  cin >> N;
  vector<LL> a(N), b(N);
  cin >> a >> b;

  map<LL, int> mp;
  for (int i = 0; i < N; ++i) {
    mp[a[(i + 1) % N] ^ a[i]];
    mp[b[(i + 1) % N] ^ b[i]];
  }
  int cnt = 0;
  for (auto &p : mp) {
    p.sc = cnt++;
  }

  vector<int> A(2 * N), B(N);
  for (int i = 0; i < 2 * N; ++i) {
    A[i] = mp[a[(i + 1) % N] ^ a[i % N]];
  }
  for (int i = 0; i < 2 * N; ++i) {
    B[i] = mp[b[(i + 1) % N] ^ b[i]];
  }

  RollingHash r1(A), r2(B);
  vector<pair<int, LL>> ans;
  for (int k = 0; k < N; ++k) {
    if (r1.get(k, k + N, 0) == r2.get(0, N, 0) &&
        r1.get(k, k + N, 1) == r2.get(0, N, 1)) {
      ans.push_back({k, a[k] ^ b[0]});
    }
  }

  for (auto &p : ans) {
    cout << p.fs << " " << p.sc << endl;
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

// std::vector Declaration
template <typename T> vector<T> make_v(size_t a) { return vector<T>(a); }
template <typename T, typename... Ts> auto make_v(size_t a, Ts... ts) {
  return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}

// std::vector Declaration and Initialization
template <typename T> vector<T> make_vector(size_t a, T x) {
  return vector<T>(a, x);
}
template <typename T, typename U, typename... Ts>
auto make_vector(size_t a, U b, Ts... ts) {
  return vector<decltype(make_vector<T>(b, ts...))>(a,
                                                    make_vector<T>(b, ts...));
}

// std::vector Input
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &e : v)
    is >> e;
  return is;
}

// std::vector Debug
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  bool a = 1;
  for (auto e : v) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "]";
  return os;
}

// std::array Debug
template <typename T, size_t n>
ostream &operator<<(ostream &os, const array<T, n> &v) {
  os << "[";
  bool a = 1;
  for (auto e : v) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "]";
  return os;
}

// std::deque Debug
template <typename T> ostream &operator<<(ostream &os, const deque<T> &d) {
  os << "[";
  bool a = 1;
  for (auto e : d) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "]";
  return os;
}

// std::pair Debug
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << " " << p.second << ")";
  return os;
}

// std::set Debug
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) {
  os << "{";
  bool a = 1;
  for (auto e : st) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "}";
  return os;
}

// std::multiset Debug
template <typename T> ostream &operator<<(ostream &os, const multiset<T> &st) {
  os << "{";
  bool a = 1;
  for (auto e : st) {
    os << (a ? "" : " ");
    os << e;
    a = 0;
  }
  os << "}";
  return os;
}

// std::map Debug
template <typename T, typename U>
ostream &operator<<(ostream &os, const map<T, U> &mp) {
  os << "{";
  bool a = 1;
  for (auto e : mp) {
    os << (a ? "" : " ");
    os << e.first << ":" << e.second;
    a = 0;
  }
  os << "}";
  return os;
}

// std::tuple Debug
template <int N, class Tuple> void out(ostream &os, const Tuple &t) {}
template <int N, class Tuple, class H, class... Ts>
void out(ostream &os, const Tuple &t) {
  if (N)
    os << " ";
  os << get<N>(t);
  out<N + 1, Tuple, Ts...>(os, t);
}
template <class... Ts> ostream &operator<<(ostream &os, const tuple<Ts...> &t) {
  os << "(";
  out<0, tuple<Ts...>, Ts...>(os, t);
  os << ")";
  return os;
}

// Debug
#define DUMP(x) cerr << #x << " = " << (x) << endl

// Weighted edge
template <typename T> struct edge {
  int src, to;
  T cost;

  edge(int to, T cost) : src(-1), to(to), cost(cost) {}
  edge(int src, int to, T cost) : src(src), to(to), cost(cost) {}

  friend ostream &operator<<(ostream &os, const edge &e) {
    return os << "(" << e.src << "->" << e.to << ":" << e.cost << ")";
  }
};

using LL = long long;

#define fs first
#define sc second

const LL MOD = 1e9 + 7;

struct RollingHash {
  const int base = 9973;
  const int mod[2] = {999999937, 1000000007};
  vector<int> s;
  vector<LL> hash[2], pow[2];

  RollingHash(const vector<int> &cs) : s(cs) {
    int n = s.size();
    for (int id = 0; id < 2; ++id) {
      hash[id].assign(n + 1, 0);
      pow[id].assign(n + 1, 1);
      for (int i = 0; i < n; ++i) {
        hash[id][i + 1] = (hash[id][i] * base + s[i]) % mod[id];
        pow[id][i + 1] = pow[id][i] * base % mod[id];
      }
    }
  }

  // get hash of s[l:r)
  LL get(int l, int r, int id = 0) {
    LL res = hash[id][r] - hash[id][l] * pow[id][r - l] % mod[id];
    if (res < 0)
      res += mod[id];
    return res;
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  cin >> N;
  vector<LL> a(N), b(N);
  cin >> a >> b;

  map<LL, int> mp;
  for (int i = 0; i < N; ++i) {
    mp[a[(i + 1) % N] ^ a[i]];
    mp[b[(i + 1) % N] ^ b[i]];
  }
  int cnt = 0;
  for (auto &p : mp) {
    p.sc = cnt++;
  }

  vector<int> A(2 * N), B(N);
  for (int i = 0; i < 2 * N; ++i) {
    A[i] = mp[a[(i + 1) % N] ^ a[i % N]];
  }
  for (int i = 0; i < N; ++i) {
    B[i] = mp[b[(i + 1) % N] ^ b[i]];
  }

  RollingHash r1(A), r2(B);
  vector<pair<int, LL>> ans;
  for (int k = 0; k < N; ++k) {
    if (r1.get(k, k + N, 0) == r2.get(0, N, 0) &&
        r1.get(k, k + N, 1) == r2.get(0, N, 1)) {
      ans.push_back({k, a[k] ^ b[0]});
    }
  }

  for (auto &p : ans) {
    cout << p.fs << " " << p.sc << endl;
  }
  return 0;
}