#include <bits/stdc++.h>
using namespace std;

const int64_t MOD= 1000000007;
/* 剰余環 Z/nZ */
struct mint{ // Z/nZ に関する演算(n:素数の場合は除算も)をサポートする構造体
  int64_t rep; // 出力すべき代表元 rep \in {0,1,..,MOD- 1}
  mint(int64_t x=0): rep(((x%MOD)+ MOD)% MOD){}
  mint operator-() const { return mint(-rep);}
  mint& operator+=(const mint& x){
    rep+= x.rep; 
    if(rep>= MOD) rep-= MOD;
    return *this;
  }
  mint& operator-=(const mint& x){
    rep-= x.rep;
    if(rep< 0) rep+= MOD;
    return *this;
  }
  mint& operator*=(const mint& x){
    rep*= x.rep; rep%= MOD;
    return *this;
  }
  mint operator+(const mint x) const {
    mint ans(*this);
    ans+= x;
    return ans;
  }
  mint operator-(const mint x) const {
    mint ans(*this);
    ans-= x;
    return ans;
  }
  mint operator*(const mint x) const {
    mint ans(*this);
    ans*= x;
    return ans;
  }

  mint pow(int64_t d) const{ // d \geq 0
    if(d<=0) return 1; /* この問題に合うように d<0 のときに対応  */
    else{
      mint ans= pow(d>>1);
      ans*= ans;
      if(d&1){ ans*= *this; }

      return ans;
    }
  }

  friend istream& operator >> (istream &is, mint& x) noexcept{
    int64_t a;
    is >> a;
    x= a;
    return is;
  }
  friend ostream& operator << (ostream &os, const mint& x) noexcept{
      return os << x.rep;
  }
  // MOD が素数(<=> Z/nZ が体)のとき
  mint inv() const{
    return pow(MOD-2);
  }
  mint& operator/=(const mint& x){
    *this *= x.inv();
    return *this;
  }
  mint operator/(const mint x) const {
    mint ans(*this);
    ans/= x;
    return ans;
  }
};
// ^^^ テンプレここまで ^^^

int main(){
  const mint three= 3;

  string S;
  cin >> S;

  vector<int> posA;
  vector<int> posB;
  vector<int> posC;
  vector<int> posW;

  for(int i=0; i<S.size(); i++){
    if(S.at(i)=='A'){ posA.emplace_back(i); }
    if(S.at(i)=='B'){ posB.emplace_back(i); }
    if(S.at(i)=='C'){ posC.emplace_back(i); }
    if(S.at(i)=='?'){ posW.emplace_back(i); }
  }
  const int Q= posW.size();
  
  mint ans= 0; /* (i,j,k)が同じでも元の文字列が違えば重複してカウントすることに注意 */
  for(auto pB:posB){
    auto itrA= lower_bound(posA.begin(), posA.end(), pB);
    auto itrC= lower_bound(posC.begin(), posC.end(), pB);
    auto itrW= lower_bound(posW.begin(), posW.end(), pB);

    mint choiceA   = distance(posA.begin(), itrA);
    mint choiceWasA= distance(posW.begin(), itrW);
    mint choiceC   = distance(itrC, posC.end());
    mint choiceWasC= distance(itrW, posW.end());

    mint patternAC= three.pow(Q)  * choiceA   * choiceC;
    mint patternWC= three.pow(Q-1)* choiceWasA* choiceC;
    mint patternAW= three.pow(Q-1)* choiceA   * choiceWasC;
    mint patternWW= three.pow(Q-2)* choiceWasA* choiceWasC;

    ans+= patternAC+ patternWC+ patternAW+ patternWW;
  }
  for(auto pWasB:posW){
    auto itrA= lower_bound(posA.begin(), posA.end(), pWasB);
    auto itrC= lower_bound(posC.begin(), posC.end(), pWasB);
    auto itrWasA= lower_bound(posW.begin(), posW.end(), pWasB);
    auto itrWasC= upper_bound(posW.begin(), posW.end(), pWasB);

    mint choiceA   = distance(posA.begin(), itrA);
    mint choiceWasA= distance(posW.begin(), itrWasA);
    mint choiceC   = distance(itrC   , posC.end());
    mint choiceWasC= distance(itrWasC, posW.end());

    mint patternAC= three.pow(Q-1)* choiceA   * choiceC;
    mint patternWC= three.pow(Q-2)* choiceWasA* choiceC;
    mint patternAW= three.pow(Q-2)* choiceA   * choiceWasC;
    mint patternWW= three.pow(Q-3)* choiceWasA* choiceWasC;

    ans+= patternAC+ patternWC+ patternAW+ patternWW;
  }

  cout << ans << endl;
}

Measured memory_bytes: 1084