#include #define int long long using namespace std; char s[200010]; int n,mod,ans,tmp,z[200010],two[200010],zz[200010],w[200010],ww[200010]; signed main(){ mod=998244353*1ll; scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++){ if(s[i]=='?'){ w[i]=w[i-1]+1ll; z[i]=z[i-1]; } else if(s[i]=='0'){ w[i]=w[i-1]; z[i]=z[i-1]+1ll; } else{ w[i]=w[i-1]; z[i]=z[i-1]; } } for(int i=n;i>=1;i--){ if(s[i]=='?'){ ww[i]=ww[i+1]+1ll; zz[i]=zz[i+1]; } else if(s[i]=='0'){ ww[i]=ww[i+1]; zz[i]=zz[i+1]+1ll; } else{ ww[i]=ww[i+1]; zz[i]=zz[i+1]; } } two[0]=1ll; for(int i=1;i<=n;i++) two[i]=(two[i-1]*2ll)%mod; for(int i=1;i<=n;i++){ if(s[i]!='0'){ tmp=two[w[i-1]+ww[i+1]]*((z[i-1]*zz[i+1])%mod)%mod; if(w[i-1]>0) tmp=(tmp+two[w[i-1]+ww[i+1]-1]*(w[i-1]*zz[i+1]%mod)%mod)%mod; if(ww[i+1]>0) tmp=(tmp+two[w[i-1]+ww[i+1]-1]*(ww[i+1]*z[i-1]%mod)%mod)%mod; if(w[i-1]>0&&ww[i+1]>0) tmp=(tmp+two[w[i-1]+ww[i+1]-2]*(w[i-1]*ww[i+1]%mod)%mod)%mod; ans=(ans+tmp)%mod; } } printf("%lld",ans%mod); return 0; }