#include <bits/stdc++.h>
template <class A>
void transpose(std::vector<std::vector<A>>& v) {
  std::vector<std::vector<A>> result((int)v[0].size(),
                                     std::vector<A>((int)v.size()));
  for (int i = 0; i < (int)v.size(); i++) {
    for (int j = 0; j < (int)v[0].size(); j++) {
      result[j][i] = v[i][j];
    }
  }
  v = result;
}
std::string to_string(const std::string& s) { return '"' + s + '"'; }
std::string to_string(const char* s) { return to_string((std::string)s); }
std::string to_string(const bool& b) { return (b ? "true" : "false"); }
std::string to_string(const char& c) { return (std::string) "'" + c + "'"; }
std::string to_string(const std::vector<bool>& v) {
  if (v.empty()) {
    return "{ empty }";
  }
  std::string ret = "{" + to_string(v.front());
  for (int i = 1; i < static_cast<int>(v.size()); i++) {
    ret += ", " + to_string(v[i]);
  }
  return ret + "}";
}
template <typename A>
std::string to_string(A x) {
  return std::to_string(x);
}
template <typename A, typename B>
std::string to_string(std::pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
std::string to_string(const std::vector<A>& v) {
  if (v.empty()) {
    return "{ empty }";
  }
  std::string ret = "{" + to_string(v.front());
  for (int i = 1; i < static_cast<int>(v.size()); i++) {
    ret += ", " + to_string(v[i]);
  }
  return ret + "}";
}
template <typename A>
std::string to_string(const std::set<A>& st) {
  if (st.empty()) {
    return "[empty]";
  }
  auto it = st.begin();
  std::string ret = "[" + to_string(*it);
  it++;
  for (; it != st.end(); it++) {
    ret += ", " + to_string(*it);
  }
  return ret + "]";
}
template <typename A>
std::string to_string(const std::unordered_set<A>& st) {
  if (st.empty()) {
    return "[empty]";
  }
  auto it = st.begin();
  std::string ret = "[" + to_string(*it);
  it++;
  for (; it != st.end(); it++) {
    ret += ", " + to_string(*it);
  }
  return ret + "]";
}
template <typename A, typename B>
std::string to_string(const std::map<A, B>& mp) {
  if (mp.empty()) {
    return "[empty]";
  }
  auto it = mp.begin();
  std::string ret =
      "[(" + to_string((*it).first) + ": " + to_string((*it).second) + ")";
  it++;
  for (; it != mp.end(); it++) {
    ret +=
        ", (" + to_string((*it).first) + ": " + to_string((*it).second) + ")";
  }
  return ret + "]";
}
template <typename A, typename B>
std::string to_string(const std::unordered_map<A, B>& mp) {
  if (mp.empty()) {
    return "[empty]";
  }
  auto it = mp.begin();
  std::string ret =
      "[(" + to_string((*it).first) + ": " + to_string((*it).second) + ")";
  it++;
  for (; it != mp.end(); it++) {
    ret +=
        ", (" + to_string((*it).first) + ": " + to_string((*it).second) + ")";
  }
  return ret + "]";
}
template <typename A>
std::string to_string(const std::queue<A>& q) {
  if (q.empty()) {
    return "[empty]";
  }
  std::queue<A> bckp = q;
  std::string ret = "[" + to_string(bckp.front());
  bckp.pop();
  while (!bckp.empty()) {
    A tp = bckp.front();
    bckp.pop();
    ret += ", " + to_string(tp);
  }
  return ret + "]";
}
template <typename A>
std::string to_string(const std::priority_queue<A>& pq) {
  if (pq.empty()) {
    return "[empty]";
  }
  std::priority_queue<A> bckp = pq;
  std::string ret = "[" + to_string(bckp.top());
  bckp.pop();
  while (!bckp.empty()) {
    A tp = bckp.top();
    bckp.pop();
    ret += ", " + to_string(tp);
  }
  return ret + "]";
}
template <typename A>
std::string to_string(const std::stack<A>& stck) {
  if (stck.empty()) {
    return "[empty]";
  }
  std::stack<A> bckp = stck;
  std::string ret = "[" + to_string(bckp.top());
  bckp.pop();
  while (!bckp.empty()) {
    A tp = bckp.top();
    bckp.pop();
    ret += ", " + to_string(tp);
  }
  return ret + "]";
}
void debug_out() { std::cerr << std::endl; }
template <typename H, typename... T>
void debug_out(H h, T... t) {
  std::cout << " " << to_string(h);
  debug_out(t...);
}
void solv(const int curt);
const bool isT = false;
int main() {
  std::ios::sync_with_stdio(0);
  std::cin.tie(0);
  int t = 1;
  if (isT) {
    std::cin >> t;
  }
  for (int i = 1; i <= t; i++) {
    solv(i);
  }
  return 0;
}
long long mod = 1e9 + 7;
void solv(const int curt) {
  int n;
  std::cin >> n;
  std::string s;
  std::cin >> s;
  long long ans = 0;
  std::vector<long long> abc(4, 0);
  abc[0] = 1;
  for (int i = 0; i < n; i++) {
    auto nw = abc;
    if (s[i] == '?') {
      for (int j = 0; j < 4; j++) {
        nw[j] *= 3;
        if (j) {
          nw[j] += abc[j - 1];
        }
        nw[j] %= mod;
      }
    } else
      nw[s[i] + 1 - 'a'] += nw[s[i] - 'a'], nw[s[i] + 1 - 'a'] %= mod;
    abc = nw;
    ans = nw.back();
  }
  std::cout << ans << "\n";
}
