// eddy1021
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
typedef double D;
typedef long double LD;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
#define mod9 1000000009LL
#define mod7 1000000007LL
#define INF  1023456789LL
#define INF16 10000000000000000LL
#define eps 1e-9
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(), (x).end()
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
#ifndef ONLINE_JUDGE
#define debug(...) printf(__VA_ARGS__)
#else 
#define debug(...)
#endif
inline LL getint(){
  LL _x=0,_tmp=1; char _tc=getchar();    
  while( (_tc<'0'||_tc>'9')&&_tc!='-' ) _tc=getchar();
  if( _tc == '-' ) _tc=getchar() , _tmp = -1;
  while(_tc>='0'&&_tc<='9') _x*=10,_x+=(_tc-'0'),_tc=getchar();
  return _x*_tmp;
}
inline LL add( LL _x , LL _y , LL _mod = mod7 ){
  _x += _y;
  return _x >= _mod ? _x - _mod : _x;
}
inline LL sub( LL _x , LL _y , LL _mod = mod7 ){
  _x -= _y;
  return _x < 0 ? _x + _mod : _x;
}
inline LL mul( LL _x , LL _y , LL _mod = mod7 ){
  _x *= _y;
  return _x >= _mod ? _x % _mod : _x;
}
LL mypow( LL _a , LL _x , LL _mod ){
  if( _x == 0 ) return 1LL;
  LL _ret = mypow( mul( _a , _a , _mod ) , _x >> 1 , _mod );
  if( _x & 1 ) _ret = mul( _ret , _a , _mod );
  return _ret;
}
LL mymul( LL _a , LL _x , LL _mod ){
  if( _x == 0 ) return 0LL;
  LL _ret = mymul( add( _a , _a , _mod ) , _x >> 1 , _mod );
  if( _x & 1 ) _ret = add( _ret , _a , _mod );
  return _ret;
}
inline bool equal( D _x ,  D _y ){
  return _x > _y - eps && _x < _y + eps;
}
#define Bye exit(0)
int __ = 1 , _cs;
/*********default*********/
#define N 505050
void build(){

}
int n;
char s[ N ];
void init(){
  n = getint();
  scanf( "%s" , s );
}
int ans;
vector<int> cnt;
int dp[ N ][ 3 ];
void cal(){
  if( cnt.size() < 2u ) return;
  int tans = 0;
  //for( size_t i = 0 ; i < cnt.size() ; i ++ )
    //fprintf( stderr , "%d%c" , cnt[ i ] , " \n"[ i + 1 == cnt.size() ] );
  for( size_t i = 1 ; i < cnt.size() ; i ++ ){
    {
      dp[ i ][ 0 ] = max( dp[ i - 1 ][ 0 ] , 
                          max( dp[ i - 1 ][ 1 ] , dp[ i - 1 ][ 2 ] ) );
    }
    {
      dp[ i ][ 1 ] = dp[ i - 1 ][ 0 ] + cnt[ i - 1 ];
      dp[ i ][ 1 ] = max( dp[ i ][ 1 ] , 
                          dp[ i - 1 ][ 1 ] + cnt[ i - 1 ] - 1 );
    }
    {
      dp[ i ][ 2 ] = dp[ i - 1 ][ 0 ] + cnt[ i ];
      if( cnt[ i - 1 ] > 1 ){
        dp[ i ][ 2 ] = max( dp[ i ][ 2 ] ,
                            dp[ i - 1 ][ 1 ] + cnt[ i ] );
        dp[ i ][ 2 ] = max( dp[ i ][ 2 ] ,
                            dp[ i - 1 ][ 2 ] + cnt[ i ] - 1 );
      }
    }
    for( int j = 0 ; j < 3 ; j ++ )
      tans = max( tans , dp[ i ][ j ] );
  }
  ans += tans;
}
void solve(){
  for( int i = 0 ; s[ i ] ; ){
    if( s[ i ] == '0' ){
      i ++;
      continue;
    }
    cnt.clear();
    int tmp = 0;
    while( s[ i ] ){
      if( s[ i ] == '1' ){
        tmp ++; i ++;
        continue;
      }else{
        if( tmp )
          cnt.push_back( tmp );
        tmp = 0;
        i ++;
        if( s[ i ] == '0' )
          break;
      }
    }
    if( tmp )
      cnt.push_back( tmp );
    cal();
  }
  printf( "%d\n" , ans );
}
int main(){
  build();
  //__ = getint();
  while( __ -- ){
    init();
    solve();
  }
}


Measured memory_bytes: 2560