#include using namespace std; using i64 = long long; const int N = 2e5 + 10, P = 998244353; char s[N]; int p2[N]; int cnt[256]; map dp; vector > edges[256]; int main() { cin >> s; int n = strlen(s); for(int i = 0; i < n; i ++) cnt[s[i]] ++; p2[0] = 1; for(int i = 1; i <= cnt['?']; i ++) p2[i] = p2[i - 1] * 2 % P; for(string i : {"0", "?"}) { edges[i[0]].push_back({"", i}); for(string j : {"1", "?"}) { edges[j[0]].push_back({i, i + j}); for(string k : {"0", "?"}) edges[k[0]].push_back({i + j, i + j + k}); } } for(char i : {'0', '1', '?'}) sort(edges[i].begin(), edges[i].end(), [](pair &a, pair &b) {return a.second.length() > b.second.length();}); dp[""] = 1; for(int i = 0; i < n; i ++) { for(auto [u, v] : edges[s[i]]) dp[v] = (dp[v] + dp[u]) % P; } int ans = 0; for(auto [s, i] : dp) { if(s.length() < 3) continue; int c2 = 0; for(char c : s) c2 += (c == '?'); ans = (ans + (i64)p2[cnt['?'] - c2] * i) % P; } cout << ans; }