fun main(args: Array<String>) {
    val s = readLine()!!
    val modVal = 1e9.toLong() + 7

    // どういうDPを構築するかが大事 (求めたい状況をどうやって表現するか)
    // dp[i-1][j]
    // dp には４つの状態 0 <= j <= 3 を考える

    // ~ A ~ B ~ C ~
    // sからABCを選んだ結果があると考え，現在 ~ の位置にあるという状態が 4 パターン
    // 直前 i - 1 文字まで考慮したときの各状態の数がわかっていれば
    // i 文字目が A, B, C, ? であった場合の状態間の遷移を表現できる

    // 自分の場合 (dp間の遷移をうまく構築できなかった ( ? が続く場合等）
    // dp[i-1][j]
    // dp には 3つの状態 0 <= j <= 2 を考える

    // i 文字目までの A の数
    // i 文字目までの AB の数
    // i 文字目までの ABC の数
    // この方法でなぜ駄目だったのか？
    // 「選ぶ」観点が抜けていたか？？　数の数え上げとしては正しい

    // 回答実装

    val dp = Array(s.length + 1) { LongArray(4) { 0L } }
    dp[0][0] = 1

    for (i in 1..(s.length)) {

        val c = s[i - 1]

        if (c == 'A' || c == '?') {
            dp[i][0] += dp[i-1][0]
            dp[i][1] += dp[i-1][1]
            dp[i][2] += dp[i-1][2]
            dp[i][3] += dp[i-1][3]

            dp[i][1] += dp[i-1][0]

            for (j in 0..3) {
                dp[i][j] = dp[i][j] % modVal
            }
        }

        if (c == 'B' || c == '?') {
            // 現在の B を選ばない場合
            dp[i][0] += dp[i-1][0]
            dp[i][1] += dp[i-1][1]
            dp[i][2] += dp[i-1][2]
            dp[i][3] += dp[i-1][3]

            // 現在の B を選ぶ場合
            dp[i][2] += dp[i-1][1]

            for (j in 0..3) {
                dp[i][j] = dp[i][j] % modVal
            }
        }

        if (c == 'C' || c == '?') {
            dp[i][0] += dp[i-1][0]
            dp[i][1] += dp[i-1][1]
            dp[i][2] += dp[i-1][2]
            dp[i][3] += dp[i-1][3]

            dp[i][3] += dp[i-1][2]

            for (j in 0..3) {
                dp[i][j] = dp[i][j] % modVal
            }
        }
    }

    println(dp[s.length][3])
}