Problem p02702 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include "bits/stdc++.h"

#define REP(i, num) for (int i = 0; i < (num); ++i)
#define LOOP(i) while (i--)
#define ALL(c) c.begin(), c.end()
#define PRINTALL(c)                                                            \\
  for (auto pitr = c.begin(); pitr != c.end(); ++pitr) {                       \\
    cout << *pitr;                                                             \\
    if (next(pitr, 1) != c.end())                                              \\
      cout << ' ';                                                             \\
  }                                                                            \\
  cout << endl;
#define PAIRCOMP(c, comp)                                                      \\
  [](const pair<ll, ll> &lhs, const pair<ll, ll> &rhs) {                       \\
    return lhs.c comp rhs.c;                                                   \\
  }

using namespace std;
using ll = long long;

constexpr ll atcoder_mod = 1e9 + 7;

template <typename T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
template <typename T = int, typename C = vector<T>> C vecin(int N) {
  C x(N);
  REP(i, N) { x[i] = in<T>(); }
  return move(x);
}

void vout() { cout << endl; }
template <typename Head, typename... Tail> void vout(Head &&h, Tail &&...t) {
  cout << ' ' << h;
  vout(forward<Tail>(t)...);
}
void out() { cout << endl; }
template <typename Head, typename... Tail> void out(Head &&h, Tail &&...t) {
  cout << h;
  vout(forward<Tail>(t)...);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  string S = in<string>();
  int N = S.size();

  vector<vector<short>> dp(N + 1, vector<short>(2019, 0));
  dp[0][0] = 0;
  REP(i, N) {
    int M = S[i] - '0';
    dp[i + 1][M] += 1;
    REP(j, 2019) {
      int V = j * 10 + (S[i] - '0');
      M = V % 2019;
      dp[i + 1][M] += dp[i][j];
    }
  }

  int sum = 0;
  REP(i, N + 1) { sum += dp[i][0]; }
  out(sum);
  return 0;
}


Error: MLE

Fixed submission:

#include "bits/stdc++.h"

#define REP(i, num) for (int i = 0; i < (num); ++i)
#define LOOP(i) while (i--)
#define ALL(c) c.begin(), c.end()
#define PRINTALL(c)                                                            \\
  for (auto pitr = c.begin(); pitr != c.end(); ++pitr) {                       \\
    cout << *pitr;                                                             \\
    if (next(pitr, 1) != c.end())                                              \\
      cout << ' ';                                                             \\
  }                                                                            \\
  cout << endl;
#define PAIRCOMP(c, comp)                                                      \\
  [](const pair<ll, ll> &lhs, const pair<ll, ll> &rhs) {                       \\
    return lhs.c comp rhs.c;                                                   \\
  }

using namespace std;
using ll = long long;

constexpr ll atcoder_mod = 1e9 + 7;

template <typename T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
template <typename T = int, typename C = vector<T>> C vecin(int N) {
  C x(N);
  REP(i, N) { x[i] = in<T>(); }
  return move(x);
}

void vout() { cout << endl; }
template <typename Head, typename... Tail> void vout(Head &&h, Tail &&...t) {
  cout << ' ' << h;
  vout(forward<Tail>(t)...);
}
void out() { cout << endl; }
template <typename Head, typename... Tail> void out(Head &&h, Tail &&...t) {
  cout << h;
  vout(forward<Tail>(t)...);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  string S = in<string>();
  int N = S.size();

  vector<vector<int>> dp(N + 1, vector<int>(2019, 0));
  dp[0][0] = 0;
  REP(i, N) {
    int M = S[i] - '0';
    dp[i + 1][M] += 1;
    REP(j, 2019) {
      int V = j * 10 + (S[i] - '0');
      M = V % 2019;
      dp[i + 1][M] += dp[i][j];
    }
  }

  int sum = 0;
  REP(i, N + 1) { sum += dp[i][0]; }
  out(sum);
  return 0;
}