#include #define el "\n" #define sp " " #define fi first #define se second #define inf 1e18 #define r0 return 0 #define int long long #define F(i, a, b, c) for (int i = a; i <= b; i += c) #define debug printf ("bug is in here\n") #define TheEnd continue #define base(s) s = sp + s #define lcm(a, b) a * b / __gcd(a, b) #define setp(x) fixed << setprecision(x) #define p 998244353 using namespace std; typedef long long ll; typedef string str; using ull = unsigned ll; str s; int n; std::map b; std::map m; inline int g(void) { int z = 0, zo = 0, zoz = 0; F(i, 1, n, 1) { if (s[i] == '0') { z++; zoz += zo; } else { zo += z; } } return zoz; } inline int f(int x) { if (b[s]) { return m[s]; } if (x == n + 1) { return g(); } if (s[x] != '?') { return f(x + 1); } s[x] = '0'; int z = f(x + 1); s[x] = '1'; int o = f(x + 1); s[x] = '?'; b[s] = 1; m[s] = (z + o) % p; return m[s]; } signed main(void) { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); cin >> s; n = s.size(); base(s); cout << f(1) << el; r0; }