# -*- coding: utf-8 -*-



"""

参考：http://tutuz.hateblo.jp/entry/2018/08/06/074104

　　　https://www.hamayanhamayan.com/entry/2018/08/05/232127

・別解

・予め必要なA,C,?の個数は集めておく。

・Bの位置を決めて、4つの選び方パターンを全部数え上げる。

・3べきの計算はpowの第三引数modで高速化

"""



MOD = 10 ** 9 + 7

S = eval(input())



# あるBの位置よりも左にあるAと?の個数

A, LQ = [0] * len(S), [0] * len(S)

for i in range(len(S)-1):

    a = lq = 0

    if S[i] == 'A':

        a += 1

    if S[i] == '?':

        lq += 1

    A[i+1] = A[i] + a

    LQ[i+1] = LQ[i] + lq

# あるBの位置よりも右にあるCと?の個数

C, RQ = [0] * len(S), [0] * len(S)

for i in range(len(S)-1, 0, -1):

    c = rq = 0

    if S[i] == 'C':

        c += 1

    if S[i] == '?':

        rq += 1

    C[i-1] = C[i] + c

    RQ[i-1] = RQ[i] + rq



ans = 0

for i in range(len(S)):

    if S[i] == '?' or S[i] == 'B':

        # (A,B,C) と選ぶ場合(後ろの3べきは使わなかった?の分)

        case1 = (A[i] * C[i] * pow(3, LQ[i] + RQ[i], MOD)) % MOD

        # (A,B,?) と選ぶ場合

        case2 = (A[i] * RQ[i] * pow(3, max(LQ[i] + RQ[i] - 1, 0), MOD)) % MOD

        # (?,B,C) と選ぶ場合

        case3 = (LQ[i] * C[i] * pow(3, max(LQ[i] + RQ[i] - 1, 0), MOD)) % MOD

        # (?,B,?) と選ぶ場合

        case4 = (LQ[i] * RQ[i] * pow(3, max(LQ[i] + RQ[i] - 2, 0), MOD)) % MOD

        # 全部足し合わせてMOD

        ans = (ans + case1 + case2 + case3 + case4) % MOD



print(ans)

# -*- coding: utf-8 -*-



import sys



def input(): return sys.stdin.readline().strip()

def list2d(a, b, c): return [[c] * b for i in range(a)]

def list3d(a, b, c, d): return [[[d] * c for j in range(b)] for i in range(a)]

def list4d(a, b, c, d, e): return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)]

def ceil(x, y=1): return int(-(-x // y))

def INT(): return int(input())

def MAP(): return map(int, input().split())

def LIST(N=None): return list(MAP()) if N is None else [INT() for i in range(N)]

def Yes(): print('Yes')

def No(): print('No')

def YES(): print('YES')

def NO(): print('NO')

sys.setrecursionlimit(10 ** 9)

INF = 10 ** 18

MOD = 10 ** 9 + 7



S = input()

N = len(S)



# dp[i][j] := i文字目まで見て、ABCのうちj文字目まで選んだ状態の通り数

dp = list2d(N+1, 4, 0)

dp[0][0] = 1

for i in range(N):

    s = S[i]

    for j in range(4):

        # 今回の文字を選ばない

        if s == '?':

            # ?は3通り遷移させる

            dp[i+1][j] += dp[i][j] * 3

            dp[i+1][j] %= MOD

        else:

            dp[i+1][j] += dp[i][j]

            dp[i+1][j] %= MOD

        # 今回の文字を選ぶ

        if j < 3:

            # 条件に合わせて次の文字へ進む

            if s == '?' or s == 'A' and j == 0 \

                        or s == 'B' and j == 1 \

                        or s == 'C' and j == 2:

                dp[i+1][j+1] += dp[i][j]

                dp[i+1][j+1] %= MOD

# N文字目まで見て、3文字選び終わっている通り数

print(dp[N][3])

# -*- coding: utf-8 -*-
"""
参考：http://tutuz.hateblo.jp/entry/2018/08/06/074104
　　　https://www.hamayanhamayan.com/entry/2018/08/05/232127
・別解
・予め必要なA,C,?の個数は集めておく。
・Bの位置を決めて、4つの選び方パターンを全部数え上げる。
・3べきの計算はpowの第三引数modで高速化
"""
MOD = 10**9 + 7
S = eval(input())
# あるBの位置よりも左にあるAと?の個数
A, LQ = [0] * len(S), [0] * len(S)
for i in range(len(S) - 1):
    a = lq = 0
    if S[i] == "A":
        a += 1
    if S[i] == "?":
        lq += 1
    A[i + 1] = A[i] + a
    LQ[i + 1] = LQ[i] + lq
# あるBの位置よりも右にあるCと?の個数
C, RQ = [0] * len(S), [0] * len(S)
for i in range(len(S) - 1, 0, -1):
    c = rq = 0
    if S[i] == "C":
        c += 1
    if S[i] == "?":
        rq += 1
    C[i - 1] = C[i] + c
    RQ[i - 1] = RQ[i] + rq
ans = 0
for i in range(len(S)):
    if S[i] == "?" or S[i] == "B":
        # (A,B,C) と選ぶ場合(後ろの3べきは使わなかった?の分)
        case1 = (A[i] * C[i] * pow(3, LQ[i] + RQ[i], MOD)) % MOD
        # (A,B,?) と選ぶ場合
        case2 = (A[i] * RQ[i] * pow(3, max(LQ[i] + RQ[i] - 1, 0), MOD)) % MOD
        # (?,B,C) と選ぶ場合
        case3 = (LQ[i] * C[i] * pow(3, max(LQ[i] + RQ[i] - 1, 0), MOD)) % MOD
        # (?,B,?) と選ぶ場合
        case4 = (LQ[i] * RQ[i] * pow(3, max(LQ[i] + RQ[i] - 2, 0), MOD)) % MOD
        # 全部足し合わせてMOD
        ans = (ans + case1 + case2 + case3 + case4) % MOD
print(ans)

# -*- coding: utf-8 -*-
import sys


def input():
    return sys.stdin.readline().strip()


def list2d(a, b, c):
    return [[c] * b for i in range(a)]


def list3d(a, b, c, d):
    return [[[d] * c for j in range(b)] for i in range(a)]


def list4d(a, b, c, d, e):
    return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)]


def ceil(x, y=1):
    return int(-(-x // y))


def INT():
    return int(input())


def MAP():
    return map(int, input().split())


def LIST(N=None):
    return list(MAP()) if N is None else [INT() for i in range(N)]


def Yes():
    print("Yes")


def No():
    print("No")


def YES():
    print("YES")


def NO():
    print("NO")


sys.setrecursionlimit(10**9)
INF = 10**18
MOD = 10**9 + 7
S = input()
N = len(S)
# dp[i][j] := i文字目まで見て、ABCのうちj文字目まで選んだ状態の通り数
dp = list2d(N + 1, 4, 0)
dp[0][0] = 1
for i in range(N):
    s = S[i]
    for j in range(4):
        # 今回の文字を選ばない
        if s == "?":
            # ?は3通り遷移させる
            dp[i + 1][j] += dp[i][j] * 3
            dp[i + 1][j] %= MOD
        else:
            dp[i + 1][j] += dp[i][j]
            dp[i + 1][j] %= MOD
        # 今回の文字を選ぶ
        if j < 3:
            # 条件に合わせて次の文字へ進む
            if (
                s == "?"
                or s == "A"
                and j == 0
                or s == "B"
                and j == 1
                or s == "C"
                and j == 2
            ):
                dp[i + 1][j + 1] += dp[i][j]
                dp[i + 1][j + 1] %= MOD
# N文字目まで見て、3文字選び終わっている通り数
print(dp[N][3])

-""" -参考：http://tutuz.hateblo.jp/entry/2018/08/06/074104 -　　　https://www.hamayanhamayan.com/entry/2018/08/05/232127 -・別解 -・予め必要なA,C,?の個数は集めておく。 -・Bの位置を決めて、4つの選び方パターンを全部数え上げる。 -・3べきの計算はpowの第三引数modで高速化 -""" +import sys + + +def input(): +    return sys.stdin.readline().strip() + + +def list2d(a, b, c): +    return [[c] * b for i in range(a)] + + +def list3d(a, b, c, d): +    return [[[d] * c for j in range(b)] for i in range(a)] + + +def list4d(a, b, c, d, e): +    return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)] + + +def ceil(x, y=1): +    return int(-(-x // y)) + + +def INT(): +    return int(input()) + + +def MAP(): +    return map(int, input().split()) + + +def LIST(N=None): +    return list(MAP()) if N is None else [INT() for i in range(N)] + + +def Yes(): +    print("Yes") + + +def No(): +    print("No") + + +def YES(): +    print("YES") + + +def NO(): +    print("NO") + + +sys.setrecursionlimit(10**9) +INF = 10**18 -S = eval(input()) -# あるBの位置よりも左にあるAと?の個数 -A, LQ = [0] * len(S), [0] * len(S) -for i in range(len(S) - 1): -    a = lq = 0 -    if S[i] == "A": -        a += 1 -    if S[i] == "?": -        lq += 1 -    A[i + 1] = A[i] + a -    LQ[i + 1] = LQ[i] + lq -# あるBの位置よりも右にあるCと?の個数 -C, RQ = [0] * len(S), [0] * len(S) -for i in range(len(S) - 1, 0, -1): -    c = rq = 0 -    if S[i] == "C": -        c += 1 -    if S[i] == "?": -        rq += 1 -    C[i - 1] = C[i] + c -    RQ[i - 1] = RQ[i] + rq -ans = 0 -for i in range(len(S)): -    if S[i] == "?" or S[i] == "B": -        # (A,B,C) と選ぶ場合(後ろの3べきは使わなかった?の分) -        case1 = (A[i] * C[i] * pow(3, LQ[i] + RQ[i], MOD)) % MOD -        # (A,B,?) と選ぶ場合 -        case2 = (A[i] * RQ[i] * pow(3, max(LQ[i] + RQ[i] - 1, 0), MOD)) % MOD -        # (?,B,C) と選ぶ場合 -        case3 = (LQ[i] * C[i] * pow(3, max(LQ[i] + RQ[i] - 1, 0), MOD)) % MOD -        # (?,B,?) と選ぶ場合 -        case4 = (LQ[i] * RQ[i] * pow(3, max(LQ[i] + RQ[i] - 2, 0), MOD)) % MOD -        # 全部足し合わせてMOD -        ans = (ans + case1 + case2 + case3 + case4) % MOD -print(ans) +S = input() +N = len(S) +# dp[i][j] := i文字目まで見て、ABCのうちj文字目まで選んだ状態の通り数 +dp = list2d(N + 1, 4, 0) +dp[0][0] = 1 +for i in range(N): +    s = S[i] +    for j in range(4): +        # 今回の文字を選ばない +        if s == "?": +            # ?は3通り遷移させる +            dp[i + 1][j] += dp[i][j] * 3 +            dp[i + 1][j] %= MOD +        else: +            dp[i + 1][j] += dp[i][j] +            dp[i + 1][j] %= MOD +        # 今回の文字を選ぶ +        if j < 3: +            # 条件に合わせて次の文字へ進む +            if ( +                s == "?" +                or s == "A" +                and j == 0 +                or s == "B" +                and j == 1 +                or s == "C" +                and j == 2 +            ): +                dp[i + 1][j + 1] += dp[i][j] +                dp[i + 1][j + 1] %= MOD +# N文字目まで見て、3文字選び終わっている通り数 +print(dp[N][3])