#pragma GCC optimize("Ofast") #define rd_skip_line() while(*rp++!=10) #define wt(v) {ulong _z=v;do*--wp=_z%10+48;while(_z/=10);} typedef unsigned long ulong; #define MD 998244353 ulong f1(){ char*mmap(); char*rp=mmap(0l,1l<<25,1,2,0,0ll); rd_skip_line(); ulong z=0; ulong a0=0,a1=0,a2=0; for(ulong c;c=*rp++,c>='0';){ ++a0; if(c=='?'){ ulong s=(a0+a1+a2)*3%MD; a0+=s; a1+=s; a2+=s; }else{ ulong m=1<<(c&15); if((1<<1|1<<4|1<<7)&m){ ulong t=a0; a0=a2; a2=a1; a1=t; } else if((1<<2|1<<5|1<<8)&m){ ulong t=a0; a0=a1; a1=a2; a2=t; } } z+=a0; } return z%MD; } void f2(ulong z){ char wbuf[64],*wp=wbuf+sizeof wbuf; wt(z); write(1,wp,wbuf+sizeof wbuf-wp); } int main(){ f2(f1()); _exit(0); }