#include <bits/stdc++.h>
// iostream is too mainstream
#include <cstdio>
// bitch please
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <cmath>
#include <iomanip>
#include <time.h>
#define dibs reserve
#define OVER9000 1234567890
#define ALL_THE(CAKE,LIE) for(auto LIE =CAKE.begin(); LIE != CAKE.end(); LIE++)
#define tisic 47
#define soclose 1e-8
#define chocolate win
// so much chocolate
#define patkan 9
#define ff first
#define ss second
#define abs(x) ((x < 0)?-(x):x)
#define uint unsigned int
#define dbl long double
#define pi 3.14159265358979323846
using namespace std;
// mylittledoge

typedef long long cat;

#ifdef DONLINE_JUDGE
	// palindromic tree is better than splay tree!
	#define lld I64d
#endif

int main() {
	cin.sync_with_stdio(0);
	cin.tie(0);
	cout << fixed << setprecision(10);
	int N;
	string S;
	cin >> N >> S;
	S.insert(begin(S), '1');
	S +='1';
	int inner1 =0, inner0 =0;
	for(int i =1; i <= 2*N; i++) if(S[i-1] == S[i]) {
		if(S[i-1] == '1') inner1++;
		else inner0++;
	}
	if(inner1%2 != 0 || inner0%2 != 0) {
		cout << "No\n";
		return 0;
	}

	vector< vector<int> > T; // topology
	for(int i =0; i <= 2*N; i++) if(i == 0 || (S[i-1] == '0' && S[i] == '1')) {
		vector<int> v(1, i);
		i++;
		while(i <= 2*N && S[i] == '1') {
			v.push_back(i);
			i++;
		}
		v.push_back(i);
		T.push_back(v);
	}
	vector<int> ans(2*N, -1);
	int col =1;

	if(inner1%4 != 0) {
		int seg =1;
		while(seg+1 < (int)T.size() && (int)T[seg].size() <= 2) seg++;
		if(seg+1 >= (int)T.size()) {
			cout << "No\n";
			return 0;
		}
		int s2 =-1;
		for(int i =0; i < (int)T.size(); i++) if((int)T[i].size() > 2 && i != seg) {
			s2 =i;
			break;
		}
		if(s2 == -1) {
			cout << "No\n";
			return 0;
		}
		ans[T[seg][0]-1] =ans[T[seg].back()-1] =col;
		col++;
		ans[T[s2][T[s2].size()-2]-1] =ans[T[seg][1]-1] =col;
		col++;
		int l =T[s2].back();
		T[s2].pop_back();
		T[s2].pop_back();
		for(int i =2; i < (int)T[seg].size()-1; i++) T[s2].push_back(T[seg][i]);
		T[s2].push_back(l);
		T.erase(begin(T)+seg);
	}

	// topology merge
	vector<int> Tfin;
	for(int i =0; i < (int)T.size(); i++) {
		if(i > 0) {
			ans[T[i-1].back()-1] =ans[T[i][0]-1] =col;
			col++;
		}
		for(int j =1; j < (int)T[i].size()-1; j++) Tfin.push_back(T[i][j]);
	}

	// 00 pairs
	int x0, p0sz =0;
	for(int i =1; i <= 2*N; i++) if(S[i] == '0' && S[i-1] == '0') {
		if(p0sz == 0) {
			x0 =i;
			p0sz++;
		}
		else {
			ans[x0-1] =ans[i-1] =col;
			p0sz =0;
			col++;
		}
	}

	// 11 pairs
	int x1[3];
	int p1sz =0;
	for(int i =0; i < (int)Tfin.size(); i++) {
		if(p1sz < 3) {
			x1[p1sz] =Tfin[i];
			p1sz++;
		}
		else {
			ans[x1[0]-1] =ans[x1[2]-1] =col;
			col++;
			ans[x1[1]-1] =ans[Tfin[i]-1] =col;
			col++;
			p1sz =0;
		}
	}

	cout << "Yes\n";
	for(int i =0; i < 2*N; i++) cout << ans[i] << ((i == 2*N-1)?"\n":" ");
	return 0;}

// look at my code
// my code is amazing
