#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <typename T = ll>
using v = vector<T>;
template <typename T = ll>
using vv = v<v<T>>;
template <typename T = ll, typename U = ll>
using p = pair<T, U>;
template <typename T>
T chmin(T& a, T b) {
  return a = min(a, b);
}
template <typename T>
T chmax(T& a, T b) {
  return a = max(a, b);
}
const ll INF = (ll)1e9;
template <int MOD>
struct ModInt {
  using lint = long long;
  int val;
  ModInt(lint v = 0) : val(v % MOD) {
    if (val < 0) val += MOD;
  };
  ModInt operator+() const { return ModInt(val); }
  ModInt operator-() const { return ModInt(MOD - val); }
  ModInt inv() const { return this->pow(MOD - 2); }
  ModInt operator+(const ModInt& x) const { return ModInt(*this) += x; }
  ModInt operator-(const ModInt& x) const { return ModInt(*this) -= x; }
  ModInt operator*(const ModInt& x) const { return ModInt(*this) *= x; }
  ModInt operator/(const ModInt& x) const { return ModInt(*this) /= x; }
  ModInt pow(lint n) const {
    auto x = ModInt(1);
    auto b = *this;
    while (n > 0) {
      if (n & 1) x *= b;
      n >>= 1;
      b *= b;
    }
    return x;
  }
  ModInt& operator+=(const ModInt& x) {
    if ((val += x.val) >= MOD) val -= MOD;
    return *this;
  }
  ModInt& operator-=(const ModInt& x) {
    if ((val -= x.val) < 0) val += MOD;
    return *this;
  }
  ModInt& operator*=(const ModInt& x) {
    val = lint(val) * x.val % MOD;
    return *this;
  }
  ModInt& operator/=(const ModInt& x) { return *this *= x.inv(); }
  ModInt operator++(int) {
    auto t = *this;
    *this += 1;
    return t;
  }
  ModInt operator--(int) {
    auto t = *this;
    *this -= 1;
    return t;
  }
  ModInt operator<<(const int n) { return ModInt(*this) * ModInt(2).pow(n); }
  bool operator==(const ModInt& b) const { return val == b.val; }
  bool operator!=(const ModInt& b) const { return val != b.val; }
  friend std::istream& operator>>(std::istream& is, ModInt& x) noexcept {
    return is >> x.val;
  }
  friend std::ostream& operator<<(std::ostream& os, const ModInt& x) noexcept {
    return os << x.val;
  }
};
constexpr int MOD = 1e9 + 7;
using mint = ModInt<MOD>;
class a {
  v<> A;
  ll N;
  string S;
  bool func(ll X, ll i) {
    if (i == N - 1) {
      if (S[i] == '0' && (!(X ^ A[i]))) {
        return false;
      }
      return true;
    }
    return func(X ^ A[i], i + 1) & func(X, i + 1);
  }

 public:
  a() {
    ll T;
    cin >> T;
    for (ll i = 0; i < (T); i++) {
      cin >> N;
      A.resize(N, 0);
      for (ll i = 0; i < (N); i++) cin >> A[i];
      cin >> S;
      cout << func(0, 0) << endl;
    }
  }
};
void b() {
  string S;
  cin >> S;
  auto dp = v<>(S.size(), 0);
  for (ll i = S.size() - 1; i >= 0; i--) {
    if (S[i] == '0') {
      dp[i] += dp[min(i + 1, (ll)S.size() - 1)] + 1;
    } else if (S[i] == '1') {
      dp[i] += dp[min(i + 1, (ll)S.size() - 1)] - 1;
    } else {
      dp[i] += dp[min(i + 1, (ll)S.size() - 1)];
    }
  }
  auto ADD = v<>(S.size(), 0);
  for (ll i = 0; i < (S.size() - 1); i++) {
    if (S[i] == '?') {
      if (dp[i] + ADD[i] >= 0)
        ADD[i + 1] = --ADD[i];
      else
        ADD[i + 1] = ++ADD[i];
    } else {
      ADD[i + 1] = ADD[i];
    }
  }
  ll ans = 0;
  for (ll i = 0; i < (S.size()); i++) {
    chmax(ans, abs(dp[i] + ADD[i]));
  }
  cout << ans << endl;
}
int main() { b(); }
