#!/usr/bin/env python3

import sys



MOD = 1000000007  # type: int





def solve(S: str):

    N = len(S)

    # 0:文字列の総数 1:Aの数  2:ABの数 3:ABCの数

    ## dp[i][j] = i文字目まで見たときに状態jの数

    ## answer: dp[N][3]



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

    dp[0][0] = 1

    for i in range(N):

        for j in (0,1,2,3):

            if S[i] == "?":

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

            else:

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



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

            

        ## カウント進める場合

        if S[i] == "A" or S[i] == "?":

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

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

        

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

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

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



        if S[i] == "C" or S[i] == "?":

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

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



    print((dp[N][3]%MOD))

    return





def main():

    def iterate_tokens():

        for line in sys.stdin:

            for word in line.split():

                yield word

    tokens = iterate_tokens()

    S = next(tokens)  # type: str

    solve(S)



if __name__ == '__main__':

    main()

#!/usr/bin/env python3

import sys



MOD = 1000000007  # type: int





def solve(S: str):

    N = len(S)

    # 0:文字列の総数 1:Aの数  2:ABの数 3:ABCの数

    ## dp[i][j] = i文字目まで見たときに状態jの数

    ## answer: dp[N][3]



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

    dp[0][0] = 1

    for i in range(N):

        for j in (0,1,2,3):

            if S[i] == "?":

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

            else:

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



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

            

        ## カウント進める場合

        if S[i] == "A" or S[i] == "?":

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

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

        

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

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

            # dp[i+1][2] %= MOD



        if S[i] == "C" or S[i] == "?":

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

            # dp[i+1][3] %= MOD



    print((dp[N][3]%MOD))

    return





def main():

    def iterate_tokens():

        for line in sys.stdin:

            for word in line.split():

                yield word

    tokens = iterate_tokens()

    S = next(tokens)  # type: str

    solve(S)



if __name__ == '__main__':

    main()

#!/usr/bin/env python3
import sys

MOD = 1000000007  # type: int


def solve(S: str):
    N = len(S)
    # 0:文字列の総数 1:Aの数  2:ABの数 3:ABCの数
    ## dp[i][j] = i文字目まで見たときに状態jの数
    ## answer: dp[N][3]
    dp = [[0] * 4 for _ in range(N + 1)]
    dp[0][0] = 1
    for i in range(N):
        for j in (0, 1, 2, 3):
            if S[i] == "?":
                dp[i + 1][j] += dp[i][j] * 3
            else:
                dp[i + 1][j] += dp[i][j]
            dp[i + 1][j] %= MOD
        ## カウント進める場合
        if S[i] == "A" or S[i] == "?":
            dp[i + 1][1] += dp[i][0]
            dp[i + 1][1] %= MOD
        if S[i] == "B" or S[i] == "?":
            dp[i + 1][2] += dp[i][1]
            dp[i + 1][2] %= MOD
        if S[i] == "C" or S[i] == "?":
            dp[i + 1][3] += dp[i][2]
            dp[i + 1][3] %= MOD
    print((dp[N][3] % MOD))
    return


def main():
    def iterate_tokens():
        for line in sys.stdin:
            for word in line.split():
                yield word

    tokens = iterate_tokens()
    S = next(tokens)  # type: str
    solve(S)


if __name__ == "__main__":
    main()

#!/usr/bin/env python3
import sys

MOD = 1000000007  # type: int


def solve(S: str):
    N = len(S)
    # 0:文字列の総数 1:Aの数  2:ABの数 3:ABCの数
    ## dp[i][j] = i文字目まで見たときに状態jの数
    ## answer: dp[N][3]
    dp = [[0] * 4 for _ in range(N + 1)]
    dp[0][0] = 1
    for i in range(N):
        for j in (0, 1, 2, 3):
            if S[i] == "?":
                dp[i + 1][j] += dp[i][j] * 3
            else:
                dp[i + 1][j] += dp[i][j]
            dp[i + 1][j] %= MOD
        ## カウント進める場合
        if S[i] == "A" or S[i] == "?":
            dp[i + 1][1] += dp[i][0]
            # dp[i+1][1] %= MOD
        if S[i] == "B" or S[i] == "?":
            dp[i + 1][2] += dp[i][1]
            # dp[i+1][2] %= MOD
        if S[i] == "C" or S[i] == "?":
            dp[i + 1][3] += dp[i][2]
            # dp[i+1][3] %= MOD
    print((dp[N][3] % MOD))
    return


def main():
    def iterate_tokens():
        for line in sys.stdin:
            for word in line.split():
                yield word

    tokens = iterate_tokens()
    S = next(tokens)  # type: str
    solve(S)


if __name__ == "__main__":
    main()

-            dp[i + 1][1] %= MOD +            # dp[i+1][1] %= MOD -            dp[i + 1][2] %= MOD +            # dp[i+1][2] %= MOD -            dp[i + 1][3] %= MOD +            # dp[i+1][3] %= MOD