import java.util.Scanner

object Main {
  val MOD = 1000000007L

  def main(args: Array[String]): Unit = {
    val sc = new Scanner(System.in)
    val S = sc.next()

    println(solve(S))
  }

  def solve(S: String): String = {
    val N = S.length
    val dp = new Array[(Long, Long, Long, Long)](N + 1) // A, AB, ABC, X
    dp.update(0, (0, 0, 0, 1))
    for (i <- 1 to N) {
      if (S.charAt(i - 1) == 'A') {
        dp.update(
          i,
          (
            (dp(i - 1)._1 + dp(i - 1)._4) % MOD,
            dp(i - 1)._2,
            dp(i - 1)._3,
            dp(i - 1)._4
          )
        )
      } else if (S.charAt(i - 1) == 'B') {
        dp.update(
          i,
          (
            dp(i - 1)._1,
            (dp(i - 1)._2 + dp(i - 1)._1) % MOD,
            dp(i - 1)._3,
            dp(i - 1)._4
          )
        )
      } else if (S.charAt(i - 1) == 'C') {
        dp.update(
          i,
          (
            dp(i - 1)._1,
            dp(i - 1)._2,
            (dp(i - 1)._3 + dp(i - 1)._2) % MOD,
            dp(i - 1)._4
          )
        )
      } else if (S.charAt(i - 1) == '?') {
        dp.update(
          i,
          (
            (dp(i - 1)._1 * 3 % MOD + dp(i - 1)._4) % MOD,
            (dp(i - 1)._2 * 3 % MOD + dp(i - 1)._1) % MOD,
            (dp(i - 1)._3 * 3 % MOD + dp(i - 1)._2) % MOD,
            dp(i - 1)._4 * 3 % MOD
          )
        )
      }
    }
    dp(N)._3.toString
  }
}