#include #define N 200005 #define int long long #define rep(_i, _s, _n) for (int _i = _s; _i <= _n; ++i) using namespace std; string s; int dp[5]; const int mod = 998244353; int last_ans = 0; int check(string s) { int len = s.size(); int ans = -1; rep(i, 0, len - 1) { if(s[i] == '?') { ans = i; return ans; } } return ans; } void dfs() { int tmp = check(s); if(tmp == -1) { int len = s.size(); memset(dp, 0, sizeof dp); rep(i, 0, len - 1) { dp[0] = (dp[0] + (s[i] == '0') % mod) % mod; dp[1] = (dp[1] + (s[i] == '1') * dp[0] % mod) % mod; dp[2] = (dp[2] + (s[i] == '0') * dp[1] % mod) % mod; } last_ans += dp[2] % mod; last_ans %= mod; return; } s[tmp] = '0'; dfs(); s[tmp] = '1'; dfs(); s[tmp] = '?'; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> s; int len = s.size(); int _cnt = 0; rep(i, 0, len - 1) { if(s[i] == '?') { ++_cnt; } } if(!_cnt) { rep(i, 0, len - 1) { dp[0] = (dp[0] + (s[i] == '0') % mod) % mod; dp[1] = (dp[1] + (s[i] == '1') * dp[0] % mod) % mod; dp[2] = (dp[2] + (s[i] == '0') * dp[1] % mod) % mod; } int ans = dp[2] % mod; cout << ans << '\n'; return 0; } dfs(); last_ans %= mod; cout << last_ans << '\n'; return 0; }