#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
typedef vector<int> VI;
const int mod = 1e8;
using ull = unsigned long long;
int n,m;
int a[1000010];
string s;
int dp[2][1000010];
int main(){
cin>>n;
cin>>s;
ll res = 0;
for(int i=1;i<=n;i++){
if(s[i-1] == '0'){
dp[0][i] = 1;
dp[1][i] = dp[0][i-1] + dp[1][i-1];
}else{
dp[0][i] = dp[1][i-1];
dp[1][i] = dp[0][i-1] + 1;
}
//cout<<dp[0][i]<<" "<<dp[1][i] << "\n";
res += dp[1][i];
}
cout<<res;
}
dp[x][i] 以 第i个数字结尾的区间值为 x (0,1) 的数量
这样考虑子问题,只要能看出dp[x][i-1] 就能求出dp[x][i]