Problem p03364 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <vector>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
#define DBG(X) cout << #X << "=" << (X) << '\n';
#else
#define DBG(X)
#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>;

const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

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 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;
}

const int MAXN = 1200;

char S[MAXN][MAXN];
int n;

bool good[MAXN][MAXN][MAXN];

void solve() {
  cin >> n;

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      cin >> S[i][j];
      S[i + n][j] = S[i][j];
      S[i][j + n] = S[i][j];
      S[i + n][j + n] = S[i][j];
    }
  }

  for (int d = 0; d < MAXN; ++d) {
    string diagonal;

    for (int i = 0; i < 2 * n; ++i) {
      for (int j = 0; j < 2 * n; ++j) {
        if (i + j == d) {
          diagonal.push_back(S[i][j]);
        }
      }
    }

    if (!diagonal.empty()) {
      DBG(d);

      DBG(diagonal[d]);
      int sz = len(diagonal);

      for (int l = sz - 1; l >= 0; --l) {
        good[d][l][l] = 1;

        if (l + 1 < sz) {
          good[d][l][l + 1] = (diagonal[l] == diagonal[l + 1]);
        }

        for (int r = l + 2; r < sz; ++r) {
          if (diagonal[l] == diagonal[r]) {
            good[d][l][r] = good[d][l + 1][r - 1];
          }
        }
      }
    }
  }

  int answ = 0;

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      int ok = 1;

      for (int d = i + j; d <= i + n - 1 + j + n - 1; ++d) {
        int fst = max(0, d - 2 * n + 1);
        int l = max(i, d - j - n + 1) - fst;
        int r = min(i + n - 1, d - j) - fst;
        assert(l <= r);

        if (!good[d][l][r]) {
          DBG(d);
          DBG(l);
          DBG(r);
          ok = 0;
          break;
        }
      }

      answ += ok;
    }
  }

  cout << answ << '\n';
}

int main() {
  fast_io();
  solve();

  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <vector>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
#define DBG(X) cout << #X << "=" << (X) << '\n';
#else
#define DBG(X)
#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>;

const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

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 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;
}

const int MAXN = 1200;

char S[MAXN][MAXN];
int n;

bitset<MAXN> good[MAXN][MAXN];

void solve() {
  cin >> n;

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      cin >> S[i][j];
      S[i + n][j] = S[i][j];
      S[i][j + n] = S[i][j];
      S[i + n][j + n] = S[i][j];
    }
  }

  for (int d = 0; d < MAXN; ++d) {
    string diagonal;

    for (int i = 0; i < 2 * n; ++i) {
      for (int j = 0; j < 2 * n; ++j) {
        if (i + j == d) {
          diagonal.push_back(S[i][j]);
        }
      }
    }

    if (!diagonal.empty()) {
      DBG(d);

      DBG(diagonal[d]);
      int sz = len(diagonal);

      for (int l = sz - 1; l >= 0; --l) {
        good[d][l][l] = 1;

        if (l + 1 < sz) {
          good[d][l][l + 1] = (diagonal[l] == diagonal[l + 1]);
        }

        for (int r = l + 2; r < sz; ++r) {
          if (diagonal[l] == diagonal[r]) {
            good[d][l][r] = good[d][l + 1][r - 1];
          }
        }
      }
    }
  }

  int answ = 0;

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      int ok = 1;

      for (int d = i + j; d <= i + n - 1 + j + n - 1; ++d) {
        int fst = max(0, d - 2 * n + 1);
        int l = max(i, d - j - n + 1) - fst;
        int r = min(i + n - 1, d - j) - fst;
        assert(l <= r);

        if (!good[d][l][r]) {
          DBG(d);
          DBG(l);
          DBG(r);
          ok = 0;
          break;
        }
      }

      answ += ok;
    }
  }

  cout << answ << '\n';
}

int main() {
  fast_io();
  solve();

  return 0;
}