#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
bool umin(T1& a, T2 b) {
  return a > b ? (a = b, true) : false;
}
template <class T1, class T2>
bool umax(T1& a, T2 b) {
  return a < b ? (a = b, true) : false;
}
template <class T>
void clear(T& a) {
  T().swap(a);
}
const int N = 2e5 + 5, mod = 1e9 + 7;
int n, m, _, k;
char s[N];
long long a[20], ans = 0;
int qpow(long long a, long long b) {
  long long ans = 1;
  a %= mod;
  for (; b; a = a * a % mod, b >>= 1)
    if (b & 1) ans = ans * a % mod;
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n;
  cin >> s + 1;
  for (int i = (1); i <= (n); ++i)
    if (s[i] == 'a')
      ++a[1];
    else if (s[i] == 'b') {
      a[3] += a[1];
      a[5] += a[2];
    } else if (s[i] == 'c') {
      a[7] += a[3];
      a[9] += a[4];
      a[10] += a[5];
      a[13] += a[6];
    } else {
      a[14] += a[6];
      a[12] += a[5];
      a[11] += a[4];
      a[8] += a[3];
      a[6] += a[2];
      a[4] += a[1];
      ++a[2];
    }
  if (a[7]) ans = a[7] % mod * qpow(3, a[2]) % mod;
  if (a[8]) ans = (ans + a[8] % mod * qpow(3, a[2] - 1) % mod) % mod;
  if (a[9]) ans = (ans + a[9] % mod * qpow(3, a[2] - 1) % mod) % mod;
  if (a[10]) ans = (ans + a[10] % mod * qpow(3, a[2] - 1) % mod) % mod;
  if (a[11]) ans = (ans + a[11] % mod * qpow(3, a[2] - 2) % mod) % mod;
  if (a[12]) ans = (ans + a[12] % mod * qpow(3, a[2] - 2) % mod) % mod;
  if (a[13]) ans = (ans + a[13] % mod * qpow(3, a[2] - 2) % mod) % mod;
  if (a[14]) ans = (ans + a[14] % mod * qpow(3, a[2] - 3) % mod) % mod;
  cout << ans;
  return 0;
}
