#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 500;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
int mini = 0, maxi = 0, n;
char s[N];
int desno[N];
int probaj(int x) {
  if (desno[0] < x) return n;
  int cur = 0, gran = 0;
  for (int i = 0; i < n; i++) {
    if (s[i] == '1') {
      cur++;
    } else if (s[i] == '0') {
      cur--;
    } else {
      if (cur + desno[i + 1] > x)
        cur--;
      else
        cur++;
    }
    gran = max(cur, gran);
  }
  return gran - x;
}
int main() {
  scanf("%s", s);
  n = strlen(s);
  desno[n] = 0;
  for (int i = n - 1; i >= 0; i--) {
    if (s[i] == '1' || s[i] == '?') {
      desno[i] = min(desno[i + 1] + 1, 0);
    } else {
      desno[i] = desno[i + 1] - 1;
    }
  }
  if (n <= 1e4) {
    int bst = n, gdje = 0;
    for (int i = 0; 2 * i <= n; i++) bst = min(bst, probaj(-i));
    printf("%d\n", bst);
  } else {
    int bst = n, gdje = 0;
    for (int i = 0; 2 * i <= n; i += 5e3) {
      int novi = probaj(-i);
      if (novi < bst) {
        bst = novi;
        gdje = i;
      }
    }
    for (int i = gdje - 200; i <= gdje + 200 && i <= n; i++) {
      if (i < 0) continue;
      int novi = probaj(-i);
      if (novi < bst) {
        bst = novi;
        gdje = i;
      }
    }
    printf("%d\n", bst);
  }
  return 0;
}
