#include <bits/stdc++.h>
using namespace std;

/*
右側の塊を考えて、なるべく現在と逆のを書きつつ、やばそうなら右側のと逆を書く
*/
template<typename T>
void chmax(T &a,T b){
  if(a<b)a=b;
}

signed main(){
  string s;cin>>s;
  int n=s.size();
  vector<int> o(n+1,0),z(n+1,0);
  int ot=0,zt=0;
  for(int i=n-1;i>=0;i--){
    if(s[i]=='0')z[i]=++zt;
    else{chmax(--zt,0);z[i]=zt;}
  }
  for(int i=n-1;i>=0;i--){
    if(s[i]=='1')o[i]=++ot;
    else{chmax(--ot,0);o[i]=ot;}
  }
  int ans=0;
  ot=zt=0;
  for(int i=0;i<n;i++){
    if(s[i]=='0'){
      chmax(ans,++zt);
      chmax(--ot,0);
    }
    else if(s[i]=='1'){
      chmax(ans,++ot);
      chmax(--zt,0);
    }
    else{
      if(zt+z[i+1]>ot+o[i+1]){
        chmax(ans,++ot);
        chmax(--zt,0);
      }
      else{
        chmax(ans,++zt);
        chmax(--ot,0);
      }
    }
  }
  int ans2=ans;
  ans=ot=zt=0;
  for(int i=0;i<n;i++){
    if(s[i]=='0'){
      chmax(ans,++zt);
      chmax(--ot,0);
    }
    else if(s[i]=='1'){
      chmax(ans,++ot);
      chmax(--zt,0);
    }
    else{
      if(zt+z[i+1]>=ot+o[i+1]){
        chmax(ans,++ot);
        chmax(--zt,0);
      }
      else{
        chmax(ans,++zt);
        chmax(--ot,0);
      }
    }
  }
  cout<<min(ans,ans2)<<endl;
}
