#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>

#include <cstdio>
#include <cstdlib>
#include <cmath>

#include <vector>
#include <deque>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <utility>

#include <string>
#include <cstring>

using namespace std;

#define LL long long
#define LD long double
#define SC(tp,var) static_cast < tp > ( var )
#define AR(tp) vector < tp >
#define PII pair < int, int >
#define PIL pair < int, long long >
#define PLI pair < long long, int >
#define PLL pair < long long, long long >
#define MP make_pair
#define FF first
#define SS second
#define PB push_back
#define PF push_front
#define POB pop_back
#define POF pop_front
#define PQ priority_queue
#define INIT(var,val) memset ( var, val, sizeof ( var ) )
#define fo(fname) freopen ( fname ".in", "r", stdin ); freopen ( fname ".out", "w", stdout );
#define lp(lpvar,lpst,lpen) for ( int lpvar = lpst, _lpen = lpen; lpvar < _lpen; ++lpvar )
#define lpi(lpvar,lpst,lpen) for ( int lpvar = lpst, _lpen = lpen; lpvar <= _lpen; ++lpvar )
#define lpd(lpvar,lpst,lpen) for ( int lpvar = lpst, _lpen = lpen; lpvar > _lpen; --lpvar )
#define lpdi(lpvar,lpst,lpen) for ( int lpvar = lpst, _lpen = lpen; lpvar >= _lpen; --lpvar )
#define qmax(a,b) (((a)<(b))?(b):(a))
#define qmin(a,b) (((a)<(b))?(a):(b))
#define qabs(a) (((a)<0)?(-(a)):(a))
#define qsqr(a) ((a)*(a))

const int INF = 0x3fffffff;
const int SINF = 0x7fffffff;
const long long LINF = 0x3fffffffffffffffLL;
const long long SLINF = 0x7fffffffffffffffLL;
const int MINF = 0x3f3f3f3f;
const LD DINF = pow ( 2, 100 );
const int MAXN = 400007;

int n, m;
char s[MAXN];
bool nd[MAXN];
int bfp[MAXN], kb;
int ans[MAXN], ka;
int gdp[MAXN], kg;
int p0[MAXN], kp0;



void init ();
void input ();
void work ();

void getmd ();



namespace task_bf
{
	const int MAXN = 100;
	int n;
	bool tar[MAXN];
	int cur[MAXN], p[MAXN];
	bool vis[MAXN];
	
	bool check ()
	{
		INIT ( vis, false );

		int now = 1;
		while ( now <= 2 * n ){
			now = p[now];
			vis[now] = true;
			++now;
		}
		lp ( i, 1, 2*n ) if ( vis[i] != tar[i] ) return false;
		return true;
	}

	bool srch ( int ni )
	{
		if ( ni > n ) return check ();

		lpi ( i, 1, n*2 ){
			if ( !cur[i] ){
				lpi ( j, i+1, n*2 ){
					if ( !cur[j] ){
						cur[i] = cur[j] = ni;
						p[i] = j, p[j] = i;
						if ( srch ( ni+1 ) ) return true;
						cur[i] = cur[j] = 0;
					}
				}
				break;
			}
		}

		return false;
	}

	bool work ()
	{
//		cerr << "task_bf::work : "; lpi ( i, 1, n ) cerr << tar[i]; cerr << endl;
		int tn = n;
		n = n >> 1;
		INIT ( cur, 0 );
		bool ans = srch ( 1 );
		n = tn;
		return ans;
	}
}

namespace task_gd
{
	int n;
	bool tar[MAXN];
	int ans[MAXN];
	int p1[MAXN], kp1;
	
	void work ()
	{
//		cerr << "task_gd : "; lpi ( i, 1, n ) cerr << tar[i]; cerr << endl;
		tar[0] = 1;
		int ka = 0;
		int c0 = -1;
		lpi ( i, 1, n ){
			if ( tar[i] ){
				if ( tar[i-1] ) p1[++kp1] = i;
				else{
					ans[c0] = ans[i] = ++ka;
					c0 = -1;
				}
			}else if ( c0 == -1 ) c0 = i;
		}
//		cerr << "p1 : "; lpi ( i, 1, kp1 ) cerr << p1[i] << " "; cerr << endl;
		for ( int i = 1; i <= kp1; i += 4 ) ans[p1[i]] = ans[p1[i+2]] = ++ka, ans[p1[i+1]] = ans[p1[i+3]] = ++ka;
	}
}



int main ()
{
	init ();
	input ();
	work ();
}



void init ()
{
	ios::sync_with_stdio ( false );
	cin.tie ( 0 );

//	fo ( "ya" );
}

void input ()
{
	scanf ( "%d%s", &n, s+1 );
}

void work ()
{
	m = n << 1;
	lp ( i, 1, m ) nd[i] = s[i] == '1';
	nd[0] = nd[m] = true;

	int c1 = 0;
	lpi ( i, 1, m ) if ( nd[i] && nd[i-1] ) ++c1;

	bool flag = true;
	bool full = false;
	if ( c1 & 1 ) flag = false;
	else if ( c1 >> 1 & 1 ){
		flag = false;
		int c0 = -1, nc = 1;
//		bool t0 = true;
		c1 = 0;
		lpi ( i, 1, m ){
			if ( nd[i] ){
				++nc;
				if ( nc >= 8 && nc % 4 == 0 ){
					full = true;
					task_bf::n -= 4;
					kb -= 4;
				}
//				if ( nc >= 2 ) t0 = true;
				if ( nc > 2 || ( nc == 2 && c0 == -1 ) ){
					task_bf::tar[++task_bf::n] = 1;
					bfp[++kb] = i;
					++c1;
				}else if ( nc == 2 ){
					task_bf::tar[++task_bf::n] = 0;
					task_bf::tar[++task_bf::n] = 1;
					bfp[++kb] = c0, bfp[++kb] = i-1;
					task_bf::tar[++task_bf::n] = 1;
					bfp[++kb] = i;
					++c1;
				}else if ( c1 % 4 == 2 ){
					task_bf::tar[++task_bf::n] = 0;
					task_bf::tar[++task_bf::n] = 1;
					bfp[++kb] = c0, bfp[++kb] = i;
					if ( task_bf::work () ){
						getmd ();
						flag = true;
						break;
					}
					task_bf::n -= 2;
					kb -= 2;
				}
				if ( !full && c1 % 4 == 2 ){
					if ( task_bf::work () ){
						getmd ();
						flag = true;
						break;
					}
				}
			}else if ( nc ) c0 = i, nc = 0, full = false;
/*				if ( nc ){
					c0 = i;
					nc = 0;
					if ( t0 && c1 % 4 == 2 ){
						task_bf::tar[++task_bf::n] = 0;
						bfp[++kb] = i;
						if ( task_bf::work () ){
							getmd ();
							flag = true;
							break;
						}
						--task_bf::n;
						--kb;
						t0 = false;
					}
				}*/
//			cerr << "after " << i << " : "; lpi ( i, 1, task_bf::n ) cerr << task_bf::tar[i]; cerr << endl;
		}
	}

	if ( !flag ){
		printf ( "No\n" );
		return;
	}
	
	lpi ( i, 1, m ){
		if ( !nd[i] && !nd[i-1] ){
			p0[++kp0] = i;
		}
	}
//	cerr << "p0 : "; lpi ( i, 1, kp0 ) cerr << p0[i] << " "; cerr << endl;
	for ( int i = 1; i <= kp0; i += 2 ) ans[p0[i]] = ans[p0[i+1]] = ++ka;

	lpi ( i, 1, m ){
		if ( !ans[i] ){
			task_gd::tar[++task_gd::n] = nd[i];
			gdp[++kg] = i;
		}
	}
	task_gd::work ();
	lpi ( i, 1, kg ){
		ans[gdp[i]] = task_gd::ans[i] + ka;
	}

	printf ( "Yes\n" );
	lpi ( i, 1, m ) printf ( "%d ", ans[i] );
	putchar ( '\n' );
}



void getmd ()
{
//	cerr << "getmd : " << endl;
//	lpi ( i, 1, kb ) cerr << bfp[i] << " "; cerr << endl;
//	lpi ( i, 1, kb ) cerr << task_bf::tar[i]; cerr << endl;
//	lpi ( i, 1, kb ) cerr << task_bf::cur[i] << " "; cerr << endl;
	lpi ( i, 1, kb ) ans[bfp[i]] = task_bf::cur[i];
	ka = kb >> 1;
}


Measured memory_bytes: 11008