#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <set>
#include <deque>
#include <bitset>

long long mod = 1e9+7;
class Mint {
public:
  long long x;
  Mint(){}; // 引数なしでも定義できるように引数なしコンストラクタも用意しておく
  Mint(long long a){
    x = a%mod;
    while(x<0){
      x += mod;
    }
  };
  Mint& operator += (const Mint &a){
    x+=a.x;
    x%=mod;
    return *this;
  }
  Mint& operator -= (const Mint &a){
    x += (mod - a.x);
    x%=mod;
    return *this;
  }
  Mint& operator *= (const Mint &a){
    x*=a.x;
    x%=mod;
    return *this;
  }

  // a^n mod を計算する
  // Useaeg: Mint z = Mint(2).pow(n);
  Mint pow(long long n) const {
    if (n==0) return Mint(1);
    Mint y = pow(n>>1); // pow(n/2)を計算する
    y *= y;
    if (n%2==1) y *= *this;
    return y;
  }

  // a^{-1} mod を計算する
  Mint modinv(const Mint &a) const {
    return a.pow(mod-2);
  }

  Mint& operator /= (const Mint &a) {
    x *= modinv(a).x;
    x %= mod;
    return *this;
  }

  Mint operator + (Mint &a) const {
    Mint y(*this);
    y += a;
    return y;
  }

  Mint operator - (Mint &a) const {
    Mint y(*this);
    y -= a;
    return y;
  }

  Mint operator * (Mint &a) const {
    Mint y(*this);
    y *= a;
    return y;
  }

  Mint operator / (Mint &a) const {
    Mint y(*this);
    y/=a;
    return y.x;
  }

  // nCk @mod を計算する
  Mint nCk(Mint &n, const long long k) const {
    Mint y = Mint(1);
    Mint one = Mint(1);
    for (Mint i(0); (i.x)<k; i.x++){
      y *= (n-i);
      y /= (i + one);
    }
    return y;
  }

  // nPk @mod を計算する
  Mint nPk(Mint &n, long long k) const {
    Mint y(1);
    for (Mint i(0); (i.x)<k; i.x++){
      y *= (n-i);
    }
    return y;
  }
};

int main() {
  std::string s;
  std::cin >> s;
  int n = s.length();
  std::vector<long long > leftA(n+4), rightC(n+4),
    leftAB(n+4), rightBC(n+4), leftQ(n+4), rightQ(n+4);
  leftA[0] = 0;
  for (int i=0; i<n; i++) {
    leftA[i+1] = leftA[i];
    if (s[i]=='A') leftA[i+1]++;
  }
  rightC[n] = 0;
  for (int i=n-1; i>=0; i--) {
    rightC[i] = rightC[i+1];
    if (s[i]=='C') rightC[i]++;
  }
  leftAB[0] = 0;
  for (int i=0; i<n; i++) {
    leftAB[i+1] = leftAB[i];
    if (s[i]=='B') leftAB[i+1] += leftA[i+1];
  }
  rightBC[n] = 0;
  for (int i=n-1; i>=0; i--) {
    rightBC[i] = rightBC[i+1];
    if (s[i]=='B') rightBC[i] += rightC[i];
  }
  leftQ[0] = 0;
  for (int i=0; i<n; i++) {
    leftQ[i+1] = leftQ[i];
    if (s[i]=='?') leftQ[i+1]++;
  }
  rightQ[n] = 0;
  for (int i=n-1; i>=0; i--) {
    rightQ[i] = rightQ[i+1];
    if (s[i]=='?') rightQ[i]++;
  }

  // ?を使わないケース
  Mint ans(0);
  for (int i=0; i<n; i++) {
    if (s[i]=='B') {
      Mint left(leftA[i]);
      Mint right(rightC[i+1]);
      Mint Q = Mint(3).pow(leftQ[n]);
      ans += left*right*Q;
    }
  }
  // printf("no?=%lld\n", ans.x);

  // ?を1こ使うケース
  // 1: AB?
  for (int i=0; i<n; i++) {
    if (s[i]=='B' && leftQ[n]>=1) {
      Mint left(leftA[i]);
      Mint right(rightQ[i+1]);
      Mint Q = Mint(3).pow(leftQ[n] - 1);
      ans += left * right * Q;
      // printf("ans temp1 = %lld\n", ans.x);
    }
  }
  // 2: A?C
  for (int i=0; i<n; i++) {
    if (s[i]=='?' && leftQ[n]>=1) {
      // printf("i=%d\n", i);
      Mint left(leftA[i]);
      Mint right(rightC[i+1]);
      Mint Q = Mint(3).pow(leftQ[n] - 1);
      ans += left * right * Q;
      // printf("ans temp2 = %lld\n", ans.x);
    }
  }
  // 1: ?BC
  for (int i=0; i<n; i++) {
    if (s[i]=='B' && leftQ[n]>=1) {
      Mint left(leftQ[i]);
      Mint right(rightC[i+1]);
      Mint Q = Mint(3).pow(leftQ[n] - 1);
      ans += left * right * Q;
      // printf("ans temp3 = %lld\n", ans.x);
    }
  }
  // printf("one ?=%lld\n", ans.x);

  // ?を2こ使うケース
  // A??
  for (int i=0; i<n; i++) {
    if (s[i]=='?' && leftQ[n]>=2) {
      Mint left(leftA[i]);
      Mint right(rightQ[i+1]);
      Mint Q = Mint(3).pow(leftQ[n] - 2);
      // printf("%lld * %lld * %lld\n", left.x, right.x, Q.x);
      ans += left * right * Q;
    }
  }
  // ?B?
  for (int i=0; i<n; i++) {
    if (s[i]=='B' && leftQ[n]>=2) {
      Mint left(leftQ[i]);
      Mint right(rightQ[i+1]);
      Mint Q = Mint(3).pow(leftQ[n] - 2);
      ans += left * right * Q;
      // printf("%lld * %lld * %lld\n", left.x, right.x, Q.x);
    }
  }
  // ??C
  for (int i=0; i<n; i++) {
    if (s[i]=='?' && leftQ[n]>=2) {
      Mint left(leftQ[i]);
      Mint right(rightC[i+1]);
      Mint Q = Mint(3).pow(leftQ[n] - 2);
      ans += left * right * Q;
      // printf("%lld * %lld * %lld\n", left.x, right.x, Q.x);
    }
  }
  // printf("two ?=%lld\n", ans.x);

  // ?を3こ使うケース
  Mint tot;
  if (leftQ[n]<3) {
    tot = 0;
  } else {
    tot = 1;
    tot *= leftQ[n];
    tot *= leftQ[n]-1;
    tot *= leftQ[n]-2;
    tot /= 6;
    tot *= Mint(3).pow(leftQ[n] - 3);
    // printf("tot=%lld\n", tot.x);
  }

  ans += tot;
  // printf("three ?=%lld\n", ans.x);

  std::cout << ans.x << std::endl;
  return 0;
}

Measured memory_bytes: 7596