#include<bits/stdc++.h>
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(){
	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(1){
			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;
		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 %c",&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(1){
		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){
			}
		}
	}
}

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