program test
implicit none

character(len=100000) :: s
integer(8) :: l,temp,ans=0,big=1000000007,ruijyo(0:100000)
integer(8) :: i,j,k,a(100000)=0,b(100000)=0,c(100000)=0,q(100000)=0
integer(8) :: ax(0:100001)=0, qx(0:100001)=0
integer(8) :: cy(0:100001)=0, qy(0:100001)=0

read(*,*) s

ruijyo(0)=1
do i=1,100000
	ruijyo(i) = mod(ruijyo(i-1)*3,big)
enddo


l = len_trim(s)

do i=1,l
	if(s(i:i)=="A") then
		a(i) = 1
	else if(s(i:i)=="B") then
		b(i) = 1
	else if(s(i:i)=="C") then
		c(i) = 1
	else
		q(i) = 1
	endif
enddo

!累積
do i=1,l
	ax(i) = ax(i-1) + a(i)
	qx(i) = qx(i-1) + q(i)
enddo

do i=l,1,-1
	cy(i) = cy(i+1) + c(i)
	qy(i) = qy(i+1) + q(i)
enddo

do i=2,l-1
	if(b(i)==1 .or. q(i)==1) then
		temp = 0
		temp = temp + (ax(i-1))*(cy(i+1))*ruijyo(qx(i-1)+qy(i+1))
		temp = temp + (qx(i-1))*(cy(i+1))*ruijyo(max(0,qx(i-1)+qy(i+1)-1))
		temp = temp + (ax(i-1))*(qy(i+1))*ruijyo(max(0,qx(i-1)+qy(i+1)-1))
		temp = temp + (qx(i-1))*(qy(i+1))*ruijyo(max(0,qx(i-1)+qy(i+1)-2))
		ans = ans + mod(temp,big)
	endif
enddo

write(*,*) mod(ans,big)


end program