#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:66777216")
using namespace std;
const long long INF = 1e18, MOD = 1e9 + 7, MAXN = 1e7 + 2;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long bin_pow(long long a, long long n) {
  if (n == 0) return 1;
  long long b = bin_pow(a, n / 2);
  if (n & 1) return b * b % MOD * a % MOD;
  return b * b % MOD;
}
long long mul(long long a, long long b) { return a * b % MOD; }
long long add(long long a, long long b) { return (a + b) % MOD; }
long long fact(long long n) {
  long long res = 1;
  for (long long i = 2; i <= n; i++) {
    res = mul(res, i);
  }
  return res;
}
long long inv(long long n) { return bin_pow(n, MOD - 2); }
long long C(long long n, long long k) {
  return mul(mul(fact(n), inv(fact(n - k))), inv(fact(k)));
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  long long n, k = 0;
  cin >> n;
  string s;
  cin >> s;
  s = '0' + s;
  long long ans = 0, res = 0;
  vector<vector<vector<long long>>> dp(
      n + 1, vector<vector<long long>>(2, vector<long long>(3)));
  for (long long i = 1; i <= n; i++) {
    dp[i][0][0] = dp[i - 1][0][0];
    dp[i][1][0] = dp[i - 1][1][0];
    if (s[i] == 'a')
      dp[i][0][0] = add(dp[i][0][0], 1);
    else if (s[i] == 'b')
      dp[i][1][0] = add(dp[i - 1][0][0], dp[i - 1][1][0]);
    else if (s[i] == 'c')
      ans = add(ans, dp[i][1][0]);
    else
      k++;
  }
  ans = ans * bin_pow(3, k);
  if (k == 0) {
    cout << ans;
    return 0;
  }
  for (long long i = 1; i <= n; i++) {
    dp[i] = dp[i - 1];
    if (s[i] == 'a') {
      dp[i][0][0] = add(dp[i][0][0], 1);
    } else if (s[i] == 'b') {
      dp[i][1][0] = add(dp[i][1][0], dp[i - 1][0][0]);
      dp[i][1][1] = add(dp[i][1][1], dp[i - 1][0][1]);
    } else if (s[i] == 'c') {
      res = add(res, dp[i][1][1]);
    } else {
      dp[i][0][1] = add(dp[i][0][1], 1);
      dp[i][1][1] = add(dp[i][1][1], dp[i - 1][0][0]);
      res = add(res, dp[i - 1][1][0]);
    }
  }
  ans = add(ans, res * bin_pow(3, k - 1));
  res = 0;
  if (k == 1) {
    cout << ans;
    return 0;
  }
  for (long long i = 1; i <= n; i++) {
    dp[i] = dp[i - 1];
    if (s[i] == 'a') {
      dp[i][0][0] = add(dp[i][0][0], 1);
    } else if (s[i] == 'b') {
      dp[i][1][0] = add(dp[i][1][0], dp[i - 1][0][0]);
      dp[i][1][1] = add(dp[i][1][1], dp[i - 1][0][1]);
    } else if (s[i] == 'c') {
      res = add(res, dp[i][1][2]);
    } else {
      dp[i][0][1] = add(dp[i][0][1], 1);
      dp[i][1][1] = add(dp[i][1][1], dp[i - 1][0][0]);
      dp[i][1][2] = add(dp[i][1][2], dp[i - 1][0][1]);
      res = add(res, dp[i - 1][1][1]);
    }
  }
  ans = add(ans, res * bin_pow(3, k - 2));
  if (k >= 3) ans = add(ans, mul(bin_pow(3, k - 3), C(k, 3)));
  cout << ans;
}
