#include using namespace std; using ll = long long; using ii = pair; using vi = vector; using vii = vector; using vvi = vector; #define ALL(x) (x).begin(),(x).end() #define ff first #define ss second #define D(a) cerr << ">> " << #a << " = >" << a << "<" << endl #define PB push_back #define F(i,a,b) for ( int i = (int)(a); i < (int)(b); ++i ) #define FD(i,a,b) for ( int i = int(a); i >= int(b); --i ) #define R1(a) scanf("%d",&a) #define R2(a,b) scanf("%d%d",&a,&b) #define R3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define DR1(a) int a; scanf("%d",&a) #define DR2(a,b) int a,b; scanf("%d%d",&a,&b) #define DR3(a,b,c) int a,b,c; scanf("%d%d%d",&a,&b,&c) const int INF = 1e9 + 7; constexpr const double PI = acos(-1); const double EPS = 1e-9; int main( ) { ios::sync_with_stdio(0); ll n = 0; char c; cin >> c; if (c == '0') { cout << -1 << endl; return 0; } do { n = n * 2 + c - '0'; } while (cin >> c); map dist{ { n, 0 } }; queue q; q.push(n); while (!q.empty()) { auto u = q.front(); q.pop(); F(i,0,40) { auto v = u | (u >> i); if (dist.insert({v, dist[u] + 1}).ss) { q.push(v); } } } cout << dist.rbegin()->second << endl; return 0; }