Problem p03003 (C++)

Buggy submission (status: Time Limit Exceeded):
#pragma GCC optimize("O3")
#pragma GCC target("tune=native")
#pragma GCC target("avx")

#include <bits/stdc++.h>

// 汎用マクロ
#define ALL_OF(x) (x).begin(), (x).end()
#define REP(i, n) for (long long i = 0, i##_len = (n); i < i##_len; i++)
#define RANGE(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i <= i##_end; i++)
#define DSRNG(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i >= i##_end; i--)
#define UNIQUE(v)                                                              \
  {                                                                            \
    sort((v).begin(), (v).end());                                              \
    (v).erase(unique((v).begin(), (v).end()), (v).end());                      \
  }
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 (a > b) {
    a = b;
    return true;
  }
  return false;
}
#define INF 0x7FFFFFFF
#define LINF 0x7FFFFFFFFFFFFFFFLL
#define Yes(q) (q ? "Yes" : "No")
#define YES(q) (q ? "YES" : "NO")
#define DUMP(q)                                                                \
  cerr << "[DEBUG] " #q ": " << (q) << " at " __FILE__ ":" << __LINE__ << endl
#define DUMPALL(q)                                                             \
  {                                                                            \
    cerr << "[DEBUG] " #q ": [";                                               \
    REP(dumpall_i, (q).size()) {                                               \
      cerr << q[dumpall_i] << (dumpall_i == (q).size() - 1 ? "" : ", ");       \
    }                                                                          \
    cerr << "] at " __FILE__ ":" << __LINE__ << endl;                          \
  }
template <class T> T gcd(const T &a, const T &b) {
  return a < b ? gcd(b, a) : b ? gcd(b, a % b) : a;
}
template <class T> T lcm(const T &a, const T &b) { return a / gcd(a, b) * b; }

// gcc拡張マクロ
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll

// エイリアス
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using namespace std;

// モジュール

// 処理内容
int main() {

  constexpr ll p = 1000000007;

  ll n, m;
  cin >> n >> m;
  vector<ll> s(n), t(m);
  REP(i, n) cin >> s[i];
  REP(i, m) cin >> t[i];

  vector<vector<ll>> dp(n + 1, vector<ll>(m + 1, 0));
  // dp[0][0] = 1;
  REP(i, n + 1) dp[i][0] = 1;
  REP(i, m + 1) dp[0][i] = 1;
  RANGE(i, 1, n) RANGE(j, 1, m) {
    dp[i][j] = (dp[i][j - 1] + dp[i - 1][j] % p + (p - dp[i - 1][j - 1])) % p;
    if (s[i - 1] == t[j - 1]) {
      dp[i][j] += dp[i - 1][j - 1];
      dp[i][j] %= p;
    }
  }
  cout << dp[n][m] << endl;

  cerr << "[DEBUG]\n";
  REP(i, n + 1) REP(j, m + 1) cerr << dp[i][j] << " \n"[j == m];
}

Fixed submission:
#pragma GCC optimize("O3")
#pragma GCC target("tune=native")
#pragma GCC target("avx")

#include <bits/stdc++.h>

// 汎用マクロ
#define ALL_OF(x) (x).begin(), (x).end()
#define REP(i, n) for (long long i = 0, i##_len = (n); i < i##_len; i++)
#define RANGE(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i <= i##_end; i++)
#define DSRNG(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i >= i##_end; i--)
#define UNIQUE(v)                                                              \
  {                                                                            \
    sort((v).begin(), (v).end());                                              \
    (v).erase(unique((v).begin(), (v).end()), (v).end());                      \
  }
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 (a > b) {
    a = b;
    return true;
  }
  return false;
}
#define INF 0x7FFFFFFF
#define LINF 0x7FFFFFFFFFFFFFFFLL
#define Yes(q) (q ? "Yes" : "No")
#define YES(q) (q ? "YES" : "NO")
#define DUMP(q)                                                                \
  cerr << "[DEBUG] " #q ": " << (q) << " at " __FILE__ ":" << __LINE__ << endl
#define DUMPALL(q)                                                             \
  {                                                                            \
    cerr << "[DEBUG] " #q ": [";                                               \
    REP(dumpall_i, (q).size()) {                                               \
      cerr << q[dumpall_i] << (dumpall_i == (q).size() - 1 ? "" : ", ");       \
    }                                                                          \
    cerr << "] at " __FILE__ ":" << __LINE__ << endl;                          \
  }
template <class T> T gcd(const T &a, const T &b) {
  return a < b ? gcd(b, a) : b ? gcd(b, a % b) : a;
}
template <class T> T lcm(const T &a, const T &b) { return a / gcd(a, b) * b; }

// gcc拡張マクロ
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll

// エイリアス
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using namespace std;

// モジュール

// 処理内容
int main() {

  constexpr ll p = 1000000007;

  ll n, m;
  cin >> n >> m;
  vector<ll> s(n), t(m);
  REP(i, n) cin >> s[i];
  REP(i, m) cin >> t[i];

  vector<vector<ll>> dp(n + 1, vector<ll>(m + 1, 0));
  // dp[0][0] = 1;
  REP(i, n + 1) dp[i][0] = 1;
  REP(i, m + 1) dp[0][i] = 1;
  RANGE(i, 1, n) RANGE(j, 1, m) {
    dp[i][j] = (dp[i][j - 1] + dp[i - 1][j] % p + (p - dp[i - 1][j - 1])) % p;
    if (s[i - 1] == t[j - 1]) {
      dp[i][j] += dp[i - 1][j - 1];
      dp[i][j] %= p;
    }
  }
  cout << dp[n][m] << endl;
}