#include <bits/stdc++.h>

using namespace std;

#ifdef DEBUG_MODE
	#define DBG(n) n;
#else
	#define DBG(n) ;
#endif
#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {for(int W = 0;W < (n);W++)cerr << v[W] << ' ';cerr << endl << endl;}
#define SHOW2d(v,i,j) {for(int aaa = 0;aaa < i;aaa++){for(int bbb = 0;bbb < j;bbb++)cerr << v[aaa][bbb] << ' ';cerr << endl;}cerr << endl;}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 1000000007

typedef long long ll;
typedef pair<ll,ll> P;

int n;
string str;
int isEdge[222222];
int cou[3];
int pointer[222222];
int ans[222222];
bool used[222222];

int main(){

	REP(i,222222)pointer[i] = i;

	cin >> n;n *= 2;

	cin >> str;
	str = '1' + str + '1';

	REP(i,n){
		int tmp = 0;
		isEdge[i] = ((str[i] == '1') + (str[i+1] == '1'));
		cou[isEdge[i]]++;
	}

	if(cou[2] % 2){
		cout << "No" << endl;
		return 0;
	}

	int nowNum = 1;

	if(cou[2] % 4 == 2){
		vector<vector<int>> paths;
		vector<int> path;
		int pla = 0;
		REP(i,n){
			if(isEdge[n-1-i] == 1){
				pla = n-1-i;
				break;
			}
		}
		for(int i = 0;i < n;i++){
			int place = (i + pla) % (n);
			if(isEdge[place] == 0){

			}
			else if(isEdge[place] == 1){
				path.PB(place);
				if(path.size() > 1){
					if(path.size() > 2){
						paths.PB(path);
					}
					path.clear();
				}
			}
			else{
				path.PB(place);
			}
		}
		if(paths.size() <= 1){
			cout << "No" << endl;
			return 0;
		}

		ans[paths[0][1]] = 1;
		ans[paths[1][1]] = 1;
		nowNum++;
		isEdge[paths[0][1]] = -1;
		isEdge[paths[1][1]] = -1;
		swap(pointer[paths[0][0]],pointer[paths[1][0]]);
	}

	vector<int> seica;
	REP(i,n){
		if(isEdge[i] == 1)seica.PB(i);
		if(seica.size() == 2){
			ans[pointer[seica[0]]] = nowNum;
			ans[pointer[seica[1]]] = nowNum;
			nowNum++;
			seica.clear();
		}
	}

	REP(i,n){
		if(isEdge[pointer[i]] == 2)seica.PB(i);
		if(seica.size() == 4){
			ans[seica[0]] = nowNum;
			ans[seica[1]] = nowNum + 1;
			ans[seica[2]] = nowNum;
			ans[seica[3]] = nowNum + 1;
			nowNum+=2;
			seica.clear();
		}
	}

	REP(i,n){
		if(isEdge[i] == 0)seica.PB(i);
		if(seica.size() == 2){
			ans[seica[0]] = nowNum;
			ans[seica[1]] = nowNum;
			nowNum++;
			seica.clear();
		}
	}

	cout << "Yes" << endl;
	REP(i,n)cout << ans[i] << ' ';cout << endl;

	return 0;
}
