s = eval(input())

ls = len(s)

dp = [[0 for _ in range(4)] for _ in range(ls+1)]

dp[0][0] = 1

mod = 10 ** 9 + 7



for i in range(1, ls+1):

    for j in range(4):

        #'?'のとき'ABC'の3通りに分岐させ、いずれも取らないので3倍

        dp[i][j] += dp[i-1][j] * (3 if s[i-1] == '?' else 1)

        if j > 0:

            #ほしい文字に変えた場合　または　ほしい文字の場合で取ったとき

            dp[i][j] += dp[i-1][j-1] if s[i-1] == 'ABC'[j-1] or s[i-1] == '?' else 0

        dp[i][j] %= mod

print((dp[ls][3]))
def ary(r, c, v): return [[v for _ in range(c)] for _ in range(r)]



s = eval(input())

ls = len(s)

dp = ary(ls + 1, 4, 0)

dp[0][0] = 1

mod = 10 ** 9 + 7



for i in range(1, ls + 1):

    for j in range(4):

        #'?'のとき'ABC'の3通りに分岐させ、いずれも取らないので3倍

        dp[i][j] += dp[i - 1][j] * (3 if s[i - 1] == '?' else 1)



       #ほしい文字に変えた場合　または　ほしい文字の場合で取ったとき

        if j > 0:

            if s[i - 1] == '?' or s[i - 1] == 'ABC'[j - 1]:

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

        dp[i][j] %= mod

print((dp[ls][3]))
s = eval(input())
ls = len(s)
dp = [[0 for _ in range(4)] for _ in range(ls + 1)]
dp[0][0] = 1
mod = 10**9 + 7
for i in range(1, ls + 1):
    for j in range(4):
        #'?'のとき'ABC'の3通りに分岐させ、いずれも取らないので3倍
        dp[i][j] += dp[i - 1][j] * (3 if s[i - 1] == "?" else 1)
        if j > 0:
            # ほしい文字に変えた場合　または　ほしい文字の場合で取ったとき
            dp[i][j] += (
                dp[i - 1][j - 1] if s[i - 1] == "ABC"[j - 1] or s[i - 1] == "?" else 0
            )
        dp[i][j] %= mod
print((dp[ls][3]))

def ary(r, c, v):
    return [[v for _ in range(c)] for _ in range(r)]


s = eval(input())
ls = len(s)
dp = ary(ls + 1, 4, 0)
dp[0][0] = 1
mod = 10**9 + 7
for i in range(1, ls + 1):
    for j in range(4):
        #'?'のとき'ABC'の3通りに分岐させ、いずれも取らないので3倍
        dp[i][j] += dp[i - 1][j] * (3 if s[i - 1] == "?" else 1)
        # ほしい文字に変えた場合　または　ほしい文字の場合で取ったとき
        if j > 0:
            if s[i - 1] == "?" or s[i - 1] == "ABC"[j - 1]:
                dp[i][j] += dp[i - 1][j - 1]
        dp[i][j] %= mod
print((dp[ls][3]))

+def ary(r, c, v): +    return [[v for _ in range(c)] for _ in range(r)] + + -dp = [[0 for _ in range(4)] for _ in range(ls + 1)] +dp = ary(ls + 1, 4, 0) +        # ほしい文字に変えた場合　または　ほしい文字の場合で取ったとき -            # ほしい文字に変えた場合　または　ほしい文字の場合で取ったとき -            dp[i][j] += ( -                dp[i - 1][j - 1] if s[i - 1] == "ABC"[j - 1] or s[i - 1] == "?" else 0 -            ) +            if s[i - 1] == "?" or s[i - 1] == "ABC"[j - 1]: +                dp[i][j] += dp[i - 1][j - 1]