Problem p02844 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
#ifdef ENABLE_DEBUG_OUTPUT
#define DEBUG_LOG(s) cout << s << endl;
#else
#define DEBUG_LOG(s) void();
#endif

int dp_solve(const int n, const string &s) {
  // x : s.size()
  // y : use cnt
  // z ; lucky number
  vector<vector<vector<bool>>> dp(
      n + 1, vector<vector<bool>>(4, vector<bool>(1000, false)));
  dp[0][0][0] = true;
  for (auto i = 0; i < n; i++) {
    for (auto j = 0; j <= 3; j++) {
      for (auto k = 0; k <= 999; k++) {
        int index = stoi(to_string(k) + s[i]);
        //                cout << i << " " << j << " " << k << " " << index <<
        //                endl; cout << dp[i][j][k] << " -> " << dp[i + 1][j][k]
        //                << endl;
        dp[i + 1][j][k] = dp[i][j][k] or dp[i + 1][j][k];
        if (index <= 999 and j < 3) {
          //                    cout << dp[i][j][k] << " -> " << dp[i + 1][j +
          //                    1][index] << endl;
          dp[i + 1][j + 1][index] = dp[i][j][k] or dp[i + 1][j + 1][index];
        }
      }
    }
  }

  //    for (auto i = 0; i <= n; i++) {
  //        for (auto j = 0; j <= 3; j++) {
  //            for (auto k = 0; k <= 30; k++) {
  //                cout << dp[i][j][k] << " ";
  //            }
  //            cout << endl;
  //        }
  //        cout << endl;
  //    }

  int cnt = 0;
  for (auto i = 0; i <= 999; i++)
    if (dp[n][3][i])
      cnt++;

  return cnt;
}

int main() {
  int n;
  string s;
  cin >> n >> s;

  //    int ans = 0;
  //    for (auto i = 0; i <= 999; i++) {
  //        vector<int> number(3);
  //        int tmp = i;
  //        for (auto j = 0; j < 3; j++) {
  //            number[j] = tmp % 10;
  //            tmp /= 10;
  //        }
  //        int cnt = 0;
  //        for (auto k = 0; k < (int)s.size(); k++) {
  //            if(s[k] - '0' == number[cnt]) cnt++;
  //            if(cnt == 3) {
  //                ans++;
  //                break;
  //            }
  //        }
  //    }
  //
  //    cout << ans << endl;

  cout << dp_solve(n, s) << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#ifdef ENABLE_DEBUG_OUTPUT
#define DEBUG_LOG(s) cout << s << endl;
#else
#define DEBUG_LOG(s) void();
#endif

int dp_solve(const int n, const string &s) {
  // x : s.size()
  // y : use cnt
  // z ; lucky number
  vector<vector<vector<bool>>> dp(
      n + 1, vector<vector<bool>>(4, vector<bool>(1000, false)));
  dp[0][0][0] = true;
  for (auto i = 0; i < n; i++) {
    for (auto j = 0; j <= 3; j++) {
      for (auto k = 0; k <= 999; k++) {
        int index = k * 10 + (s[i] - '0');
        //                cout << i << " " << j << " " << k << " " << index <<
        //                endl; cout << dp[i][j][k] << " -> " << dp[i + 1][j][k]
        //                << endl;
        dp[i + 1][j][k] = dp[i][j][k] or dp[i + 1][j][k];
        if (index <= 999 and j < 3) {
          //                    cout << dp[i][j][k] << " -> " << dp[i + 1][j +
          //                    1][index] << endl;
          dp[i + 1][j + 1][index] = dp[i][j][k] or dp[i + 1][j + 1][index];
        }
      }
    }
  }

  //    for (auto i = 0; i <= n; i++) {
  //        for (auto j = 0; j <= 3; j++) {
  //            for (auto k = 0; k <= 30; k++) {
  //                cout << dp[i][j][k] << " ";
  //            }
  //            cout << endl;
  //        }
  //        cout << endl;
  //    }

  int cnt = 0;
  for (auto i = 0; i <= 999; i++)
    if (dp[n][3][i])
      cnt++;

  return cnt;
}

int main() {
  int n;
  string s;
  cin >> n >> s;

  //    int ans = 0;
  //    for (auto i = 0; i <= 999; i++) {
  //        vector<int> number(3);
  //        int tmp = i;
  //        for (auto j = 0; j < 3; j++) {
  //            number[j] = tmp % 10;
  //            tmp /= 10;
  //        }
  //        int cnt = 0;
  //        for (auto k = 0; k < (int)s.size(); k++) {
  //            if(s[k] - '0' == number[cnt]) cnt++;
  //            if(cnt == 3) {
  //                ans++;
  //                break;
  //            }
  //        }
  //    }
  //
  //    cout << ans << endl;

  cout << dp_solve(n, s) << endl;
  return 0;
}