#include <bits/stdc++.h>
using namespace std;
inline int nxt() {
  int x;
  scanf("%d", &x);
  return x;
}
void remin(int& x, int y) { x = min(x, y); }
void remax(int& x, int y) { x = max(x, y); }
bool is_small(int x) { return x < 1e7; }
struct State {
  int len;
  int minx, maxx;
};
bool isCovered(const State& st, int x, int y) {
  if (x + y == st.len) {
    return x % 2 == st.minx % 2 && x >= st.minx && x <= st.maxx;
  } else {
    return x + y > st.len && x >= st.minx && y >= st.len - st.maxx;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  string s;
  cin >> s;
  vector<State> a = {{0, 0, 0}};
  for (char c : s) {
    vector<State> tmp;
    if (c != '1') {
      for (auto st : a) {
        if (st.minx > 0) {
          tmp.push_back({st.len, st.minx - 1, st.maxx - 1});
        } else {
          if (st.minx != st.maxx) {
            tmp.push_back({st.len, st.minx + 1, st.maxx - 1});
          }
          tmp.push_back({st.len + 1, 0, 0});
        }
      }
    }
    if (c != '0') {
      for (auto st : a) {
        if (st.maxx < st.len) {
          tmp.push_back({st.len, st.minx + 1, st.maxx + 1});
        } else {
          if (st.minx != st.maxx) {
            tmp.push_back({st.len, st.minx + 1, st.maxx - 1});
          }
          tmp.push_back({st.len + 1, st.len + 1, st.len + 1});
        }
      }
    }
    a.clear();
    for (auto s : tmp) {
      while (s.minx <= s.maxx) {
        bool cov = false;
        for (auto t : a) {
          if (isCovered(t, s.minx, s.len - s.minx)) {
            cov = true;
            break;
          }
        }
        if (cov) {
          s.minx += 2;
        } else {
          break;
        }
      }
      while (s.minx <= s.maxx) {
        bool cov = false;
        for (auto t : a) {
          if (isCovered(t, s.maxx, s.len - s.maxx)) {
            cov = true;
            break;
          }
        }
        if (cov) {
          s.maxx -= 2;
        } else {
          break;
        }
      }
      if (s.minx <= s.maxx) {
        a.push_back(s);
      }
    }
  }
  int ans = 1e8;
  for (auto s : a) {
    ans = min(ans, s.len);
  }
  cout << ans << "\n";
  return 0;
}
