Problem p03626 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

#define ll long long
#define ld long double
using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  ll mod = 1000000007;
  ll n;
  cin >> n;
  set<pair<ll, ll>> date;
  date.insert({1, 2});
  date.insert({1, 3});
  date.insert({3, 2});
  date.insert({2, 1});
  date.insert({3, 1});
  date.insert({2, 3});
  date.insert({1, 1});
  date.insert({2, 2});
  date.insert({3, 3});
  string qq, ww;
  cin >> qq >> ww;
  ll dp[100][n + 1];
  for (ll i = 1; i <= 100; i++) {
    for (ll j = 1; j <= n; j++) {
      dp[i][j] = 0;
    }
  }
  if (qq[0] != ww[0]) {
    for (auto i = date.begin(); i != date.end(); i++) {
      if (i->first != i->second) {
        ll t = i->first * 10 + i->second;
        dp[t][1] = 1;
      }
    }
  } else {
    for (auto i = date.begin(); i != date.end(); i++) {
      if (i->first == i->second) {
        ll t = i->first * 10 + i->second;
        dp[t][1] = 1;
      }
    }
  }
  for (ll i = 2; i <= n; i++) {
    if (qq[i - 2] == qq[i - 1] && ww[i - 1] == ww[i - 2]) {
      // cout << p[2][i-1] << " " << p[2][i] << i << endl;
      for (auto j = date.begin(); j != date.end(); j++) {
        for (auto k = date.begin(); k != date.end(); k++) {
          if (j->first == k->first && j->second == k->second) {
            // if (j->first != j->second) {

            ll tk = k->first * 10 + k->second;
            ll tj = j->first * 10 + j->second;
            dp[tk][i] += dp[tj][i - 1];
            dp[tk][i] %= mod;
            //}
          }
        }
      }
    } else if (qq[i - 1] == ww[i - 1]) {
      for (auto j = date.begin(); j != date.end(); j++)
        for (auto k = date.begin(); k != date.end(); k++) {
          if (j->first != k->first && j->second != k->second &&
              k->first == k->second) {
            ll tj = j->first * 10 + j->second;
            ll tk = k->first * 10 + k->second;
            dp[tk][i] = (dp[tk][i] + dp[tj][i - 1]) % mod;
          }
        }
    } else {
      for (auto j = date.begin(); j != date.end(); j++)
        for (auto k = date.begin(); k != date.end(); k++) {
          if (j->first != k->first && j->second != k->second &&
              k->first != k->second) {
            ll tj = j->first * 10 + j->second;
            ll tk = k->first * 10 + k->second;
            dp[tk][i] = (dp[tk][i] + dp[tj][i - 1]) % mod;
          }
        }
    }
  }
  ll answ = 0;
  for (auto i = date.begin(); i != date.end(); i++) {
    if (qq[n - 1] == ww[n - 1]) {
      if (i->first == i->second) {
        ll t = i->first * 10 + i->second;
        answ = (answ + dp[t][n]) % mod;
      }
    } else {
      if (i->first != i->second) {
        ll t = i->first * 10 + i->second;
        answ = (answ + dp[t][n]) % mod;
      }
    }
  }
  cout << answ << endl;
  exit(0);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

#define ll long long
#define ld long double
using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  ll mod = 1000000007;
  ll n;
  cin >> n;
  set<pair<ll, ll>> date;
  date.insert({1, 2});
  date.insert({1, 3});
  date.insert({3, 2});
  date.insert({2, 1});
  date.insert({3, 1});
  date.insert({2, 3});
  date.insert({1, 1});
  date.insert({2, 2});
  date.insert({3, 3});
  string qq, ww;
  cin >> qq >> ww;
  ll dp[1000][n + 10];
  for (ll i = 1; i <= 100; i++) {
    for (ll j = 1; j <= n; j++) {
      dp[i][j] = 0;
    }
  }
  if (qq[0] != ww[0]) {
    for (auto i = date.begin(); i != date.end(); i++) {
      if (i->first != i->second) {
        ll t = i->first * 10 + i->second;
        dp[t][1] = 1;
      }
    }
  } else {
    for (auto i = date.begin(); i != date.end(); i++) {
      if (i->first == i->second) {
        ll t = i->first * 10 + i->second;
        dp[t][1] = 1;
      }
    }
  }
  for (ll i = 2; i <= n; i++) {
    if (qq[i - 2] == qq[i - 1] && ww[i - 1] == ww[i - 2]) {
      // cout << p[2][i-1] << " " << p[2][i] << i << endl;
      for (auto j = date.begin(); j != date.end(); j++) {
        for (auto k = date.begin(); k != date.end(); k++) {
          if (j->first == k->first && j->second == k->second) {
            // if (j->first != j->second) {

            ll tk = k->first * 10 + k->second;
            ll tj = j->first * 10 + j->second;
            dp[tk][i] += dp[tj][i - 1];
            dp[tk][i] %= mod;
            //}
          }
        }
      }
    } else if (qq[i - 1] == ww[i - 1]) {
      for (auto j = date.begin(); j != date.end(); j++)
        for (auto k = date.begin(); k != date.end(); k++) {
          if (j->first != k->first && j->second != k->second &&
              k->first == k->second) {
            ll tj = j->first * 10 + j->second;
            ll tk = k->first * 10 + k->second;
            dp[tk][i] = (dp[tk][i] + dp[tj][i - 1]) % mod;
          }
        }
    } else {
      for (auto j = date.begin(); j != date.end(); j++)
        for (auto k = date.begin(); k != date.end(); k++) {
          if (j->first != k->first && j->second != k->second &&
              k->first != k->second) {
            ll tj = j->first * 10 + j->second;
            ll tk = k->first * 10 + k->second;
            dp[tk][i] = (dp[tk][i] + dp[tj][i - 1]) % mod;
          }
        }
    }
  }
  ll answ = 0;
  for (auto i = date.begin(); i != date.end(); i++) {
    if (qq[n - 1] == ww[n - 1]) {
      if (i->first == i->second) {
        ll t = i->first * 10 + i->second;
        answ = (answ + dp[t][n]) % mod;
      }
    } else {
      if (i->first != i->second) {
        ll t = i->first * 10 + i->second;
        answ = (answ + dp[t][n]) % mod;
      }
    }
  }
  cout << answ << endl;
  exit(0);
  return 0;
}