import java.math.BigInteger;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] b = new int[n];
String s = in.next();
for (int i = 0; i < n; i++) {
b[i] = (s.charAt(i) == '1') ? 1 : 0;
}
/** 算法设计依据
* (1) 000…01(n位)--(n-1)次--> 111…11 --n次--> 000…00
* (2) 假定序列[…]需要x次操作变为[0…0](全0),有
* I. 1[…]--x次-->1[0…0]
* II. 0[…]00…01--x次-->0[0…0]00…01
* 因此,较长序列的处理可以递归地转化到子序列的处理上
* (3) 序列的后缀0可以忽略
*/
int left = 0;
int right = b.length;
// 双指针遍历数组
while (left < right) {
if (b[left] == 0) {
// 如果左指针指向0,则需要找到右侧最近的1来配对
right--; // 右指针左移
// 继续移动右指针直到找到1或与左指针相遇
while (right > left && b[right] != 1) {
right--;
}
// 如果左右指针相遇,说明没有可配对的1,结束循环
if (right == left) {
break;
}
// 计算当前0和右侧1之间的距离(包含两端)
int distance = right - left + 1;
b[left] = -distance; // 在左指针位置标记负的距离值
}
left++; // 左指针右移
}
// 计算最终结果
BigInteger t = BigInteger.ZERO;
// 从右向左遍历处理后的数组
for (int i = left - 1; i >= 0; i--) {
if (b[i] > 0) {
// 遇到1,结果加1
t = t.add(BigInteger.ONE);
} else {
// 遇到标记的负距离值,计算对应的贡献值
// 公式:-b[i] * 2 - 1(因为距离为d时贡献值为2d-1)
t = t.add(BigInteger.valueOf(-b[i] * 2 - 1));
}
}
System.out.println(t); // 输出最终结果
}
}