Problem p02816 (C++)

Buggy submission (status: Time Limit Exceeded):
// abc150
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define cinf(n, x)                                                             \
  for (int i = 0; i < (n); i++)                                                \
    cin >> x[i];
#define ft first
#define sc second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(), (v).end()
#define mod 1000000007
using namespace std;
typedef long long ll;
template <class T> using V = vector<T>;
using Graph = vector<vector<int>>;
using P = pair<ll, ll>;
typedef unsigned long long ull;
typedef long double ldouble;
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

const ll INF = 1e18;

const ull B = 1000000007; // ハッシュの基数

// aはbに含まれているか？
bool contain(string a, string b) {
  int al = a.length(), bl = b.length();
  if (al > bl)
    return false;

  // Bのal乗を計算
  ull t = 1;
  for (int i = 0; i < al; i++)
    t *= B;

  // aとbの最初のal文字に関するハッシュ値を計算
  ull ah = 0, bh = 0;
  for (int i = 0; i < al; i++)
    ah = ah * B + a[i];
  for (int i = 0; i < al; i++)
    bh = bh * B + b[i];

  // bの場所を1つずつ進めながらハッシュ値をチェック
  for (int i = 0; i + al <= bl; i++) {
    if (ah == bh)
      return true; // bのi文字目からのal文字が一致
    if (i + al < bl)
      bh = bh * B + b[i + al] - b[i] * t;
  }
  return false;
}

int main() {
  int n;
  cin >> n;
  V<ll> a(n), b(n), c(n - 1), d(n);
  cinf(n, a);
  cinf(n, b);
  rep(i, n - 1) c[i] = (b[i] ^ b[i + 1]);
  rep(i, n) d[i] = (a[i % n] ^ a[(i + 1) % n]);
  if (n == 1) {
    cout << 0 << ' ' << (a[0] ^ b[0]) << endl;
  } else {
    priority_queue<P, V<P>, greater<P>> que;
    int cl = n - 1, dl = n; // a->c,b->d

    // Bのal乗を計算
    ull t = 1;
    for (int i = 0; i < cl; i++)
      t *= B;

    // aとbの最初のal文字に関するハッシュ値を計算
    ull ch = 0, dh = 0;
    for (int i = 0; i < cl; i++)
      ch = ch * B + c[i];
    for (int i = 0; i < cl; i++)
      dh = dh * B + d[i];

    // bの場所を1つずつ進めながらハッシュ値をチェック
    for (int i = 0; i < dl; i++) {
      if (ch == dh) {
        bool ok = 1;
        for (int j = 0; j < cl; j++) {
          if (c[j] != d[(j + i) % n]) {
            ok = 0;
          }
        }
        if (ok) {
          P p = P(i, (b[0] ^ a[i]));
          que.push(p);
        }
      } // dのi文字目からのcl文字が一致
      dh = dh * B + d[(i + cl) % n] - d[i % n] * t;
    }
    while (!que.empty()) {
      P p = que.top();
      que.pop();
      cout << p.ft << ' ' << p.sc << '\n';
    }
  }
}

Fixed submission:
// abc150
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define cinf(n, x)                                                             \
  for (int i = 0; i < (n); i++)                                                \
    cin >> x[i];
#define ft first
#define sc second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(), (v).end()
#define mod 1000000007
using namespace std;
typedef long long ll;
template <class T> using V = vector<T>;
using Graph = vector<vector<int>>;
using P = pair<ll, ll>;
typedef unsigned long long ull;
typedef long double ldouble;
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

const ll INF = 1e18;

const ull B = 1000000007; // ハッシュの基数

// aはbに含まれているか？
bool contain(string a, string b) {
  int al = a.length(), bl = b.length();
  if (al > bl)
    return false;

  // Bのal乗を計算
  ull t = 1;
  for (int i = 0; i < al; i++)
    t *= B;

  // aとbの最初のal文字に関するハッシュ値を計算
  ull ah = 0, bh = 0;
  for (int i = 0; i < al; i++)
    ah = ah * B + a[i];
  for (int i = 0; i < al; i++)
    bh = bh * B + b[i];

  // bの場所を1つずつ進めながらハッシュ値をチェック
  for (int i = 0; i + al <= bl; i++) {
    if (ah == bh)
      return true; // bのi文字目からのal文字が一致
    if (i + al < bl)
      bh = bh * B + b[i + al] - b[i] * t;
  }
  return false;
}

int main() {
  int n;
  cin >> n;
  V<ll> a(n), b(n), c(n - 1), d(n);
  cinf(n, a);
  cinf(n, b);
  rep(i, n - 1) c[i] = (b[i] ^ b[i + 1]);
  rep(i, n) d[i] = (a[i % n] ^ a[(i + 1) % n]);
  if (n == 1) {
    cout << 0 << ' ' << (a[0] ^ b[0]) << endl;
  } else {
    priority_queue<P, V<P>, greater<P>> que;
    int cl = n - 1, dl = n; // a->c,b->d

    // Bのal乗を計算
    ull t = 1;
    for (int i = 0; i < cl; i++)
      t *= B;

    // aとbの最初のal文字に関するハッシュ値を計算
    ull ch = 0, dh = 0;
    for (int i = 0; i < cl; i++)
      ch = ch * B + c[i];
    for (int i = 0; i < cl; i++)
      dh = dh * B + d[i];

    // bの場所を1つずつ進めながらハッシュ値をチェック
    for (int i = 0; i < dl; i++) {
      if (ch == dh) {
        P p = P(i, (b[0] ^ a[i]));
        que.push(p);
      } // dのi文字目からのcl文字が一致
      dh = dh * B + d[(i + cl) % n] - d[i % n] * t;
    }
    while (!que.empty()) {
      P p = que.top();
      que.pop();
      cout << p.ft << ' ' << p.sc << '\n';
    }
  }
}