#include <algorithm>  
#include <iostream>  
#include <sstream>  
#include <string>  
#include <cstring>
#include <vector>  
#include <queue>  
#include <set>  
#include <map>  
#include <cstdio>  
#include <cstdlib>  
#include <cctype>  
#include <cmath>  
#include <list>  
#include <cassert>
#include <ctime>
#include <climits>
using namespace std;  

#define PB push_back  
#define MP make_pair  
#define SZ(v) ((int)(v).size())  
#define FOR(i,a,b) for(int i=(a);i<(b);++i)  
#define REP(i,n) FOR(i,0,n)  
#define FORE(i,a,b) for(int i=(a);i<=(b);++i)  
#define REPE(i,n) FORE(i,0,n)  
#define FORSZ(i,a,v) FOR(i,a,SZ(v))  
#define REPSZ(i,v) REP(i,SZ(v))  
typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); }

const int MAXN=100000;
const int MAXS=2*MAXN-1;

int n;
char s[MAXS+3];

int ans[2*MAXN],nans;

void remove(vector<int> &lst,int val) { int idx=0; while(idx<SZ(lst)&&lst[idx]!=val) ++idx; assert(idx<SZ(lst)); lst.erase(lst.begin()+idx); }

vector<int> none,both,lft,rgt;
bool solve() {
	//printf("%s\n",s);
	REP(i,2*n) ans[i]=-1; nans=0; none.clear(),both.clear(),lft.clear(),rgt.clear();
	REP(i,2*n) if(s[i]=='0'&&s[i+1]=='0') none.PB(i); else if(s[i]=='0') rgt.PB(i); else if(s[i+1]=='0') lft.PB(i); else both.PB(i);
	if(SZ(lft)!=SZ(rgt)||SZ(none)%2!=0||SZ(both)%2!=0) return false;
	if(SZ(both)%4==2) {
		int at=0;
		while(at<=2*n&&s[at]=='1') ++at; if(at>2*n) return false;
		while(true) {
			while(at+1<=2*n&&s[at+1]=='0') ++at; if(at+1>2*n) return false;
			if(at+2<=2*n&&s[at+2]=='1') break; else at+=2;
		}
		int to=at+1; while(to<=2*n&&s[to]=='1') ++to; if(to>2*n) return false;
		int idx=0; while(idx<SZ(both)&&at+1<=both[idx]&&both[idx]<=to-2) ++idx; if(idx>=SZ(both)) return false;
		if(both[idx]<=at) while(idx+1<SZ(both)&&both[idx+1]+1<=at) ++idx;
		//printf("at=%d to=%d both[idx]=%d\n",at,to,both[idx]);
		int a=at,b=to-1,c=a+1,d=both[idx]; ans[a]=ans[b]=++nans,ans[c]=ans[d]=++nans; remove(rgt,a); remove(lft,b); remove(both,c); remove(both,d);
	}
	REPSZ(i,lft) { int a=lft[i],b=rgt[i]; ans[a]=ans[b]=++nans; }
	for(int i=0;i<SZ(none);i+=2) { int a=none[i],b=none[i+1]; ans[a]=ans[b]=++nans; }
	for(int i=0;i<SZ(both);i+=4) { int a=both[i],b=both[i+1],c=both[i+2],d=both[i+3]; ans[a]=ans[c]=++nans; ans[b]=ans[d]=++nans; }
	return true;
}

void run() {
	scanf("%d%s",&n,s+1); s[0]='1'; s[2*n]='1'; s[2*n+1]='\0';
	if(!solve()) { printf("No\n"); return; }
	printf("Yes\n");
	REP(i,2*n) { if(i!=0) printf(" "); printf("%d",ans[i]); } puts("");
}

char t[MAXS+3];
int sum[MAXN+1];
void testans() {
	FORE(i,1,n) sum[i]=0; REP(i,2*n) sum[ans[i]]+=i;
	REP(i,2*n) t[i]='0'; t[2*n+1]='\0';
	int at=0;
	while(true) {
		t[at]='1';
		if(at==2*n) break; else at=sum[ans[at]]-at+1;
	}
	if(strcmp(s,t)!=0) {
		printf("%s vs %s\n",s,t);
		printf("ans:"); REP(i,2*n) printf(" %d",ans[i]); puts("");
	}
}

void stress() {
	for(n=1;n<=10;++n) {
		REP(mask,1<<(2*n-1)) {
			s[0]='1'; REP(i,2*n-1) s[i+1]='0'+((mask>>i)&1); s[2*n]='1'; s[2*n+1]='\0';
			if(solve()) {
				testans();
			} else if(SZ(lft)==SZ(rgt)&&SZ(none)%2==0&&SZ(both)%2==0) {
				//printf("not %s\n",s);
			}
		}
	}
}

int main() {
	run();
	//stress();
	return 0;
}


Measured memory_bytes: 3448