#include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define rreps(X,S,Y) for (int (X) = (Y)-1;(X) >= (S);--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())
#define Endl endl

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class T,size_t n> ostream& operator<<(ostream &os, const array<T,n> &t) {
	os<<"{"; rep(i,n) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class S, class T,class U> ostream& operator<<(ostream &os, const tuple<S,T,U> &t) { return os<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<")";}
template<class S, class T,class U,class V> ostream& operator<<(ostream &os, const tuple<S,T,U,V> &t) { return os<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<","<<get<3>(t)<<")";}
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
#undef NUIP
#ifdef NUIP
#define out(args...){vector<string> a_r_g_s=s_p_l_i_t(#args, ','); e_r_r(a_r_g_s.begin(), args); }
vector<string> s_p_l_i_t(const string &s, char c){vector<string> v;int d=0,f=0;string t;for(char c:s){if(!d&&c==',')v.pb(t),t="";else t+=c;if(c=='\"'||c=='\'')f^=1;if(!f&&c=='(')++d;if(!f&&c==')')--d;}v.pb(t);return move(v);}
void e_r_r(vector<string>::iterator it) {}
template<typename T, typename... Args> void e_r_r(vector<string>::iterator it, T a, Args... args){ if(*it==" 1"||*it=="1") cerr<<endl; else cerr << it -> substr((*it)[0] == ' ', it -> length()) << " = " << a << ", "; e_r_r(++it, args...);}
#else
#define out
#endif
template<typename T>vector<T> table(int n, T v){ return vector<T>(n, v);}
template <class... Args> auto table(int n, Args... args){auto val = table(args...); return vector<decltype(val)>(n, move(val));}
const ll MOD=1e9+7;
void NO(int why){ out(why,1); cout<<"No"<<endl; exit(0);}
vector<int> solve(string s){
	s="1"+s+"1";
	int n=s.size();
	vector<int> re(n-1);
	vector<int> cs(n-1);
	rep(i,n-1) cs[i]=2*(s[i]-'0')+(s[i+1]-'0');
	vector<pii> ps;
	int cnt=0;
	int s3=0;
	rep(i,n-1)if(cs[i]==3) ++s3;
	if(s3%2) NO(1);
	int id=-10;
	int idd=0;
	if(s3%4){
		idd=MOD;
		int prv=-1;
		int ev=-1;
		int evv=MOD;
		rep(i,n-1){
			if(cs[i]==1) prv=i;
			else if(cs[i]==2){
				if(prv>=0){
					if(prv%2==i%2){
						if(MN(idd, i-prv)) id=prv;
					}else{
						if((i-prv)%4!=1 && MN(evv, i-prv)) ev=prv;
					}
				}
			}else if(cs[i]==0) prv=-1;
			out(i,cs[i],prv,1);
		}
		if(id<0){
			id=ev; idd=evv;
		}
	}
	if(id<0) idd=0;
	vector<int> zeros;
	pii P,Q;
	rep(i,n-1){
		if(id<=i && i<=id+idd) continue;
		if(cs[i]==0){
			zeros.pb(i);
		}else{
			if(cs[i-1]==0){
				re[i]=re[ps.back().X]=cnt++;
				assert(ps.back().Y==2);
				if(ps.back().X<id && i>id+idd){
					P=ps.back();
					Q=pii(i,cs[i]);
				}
				ps.pop_back();
			}else{
				ps.eb(i,cs[i]);
			}
		}
	}
	if(zeros.size()%2) NO(3);
	rep(i,zeros.size())if(i%2) re[zeros[i-1]]=re[zeros[i]]=cnt++;
	out(id,idd,1);
	if(id>=0 && idd%2){
		int head=0,tail=0;
		rep(i,ps.size()){ if(ps[i].Y!=3) break; ++head;}
		rrep(i,ps.size()){ if(ps[i].Y!=3) break; ++tail;}
		out(head,tail,1);
		if(head==tail){
			ps.pb(P); ps.pb(Q); sort(all(ps));
			head=0,tail=0;
			rep(i,ps.size()){ if(ps[i].Y!=3) break; ++head;}
			rrep(i,ps.size()){ if(ps[i].Y!=3) break; ++tail;}
		}
		if(head%2==0 && tail%2==0){
			vector<int> vs;
			int prv;
			rep(i,ps.size()-tail){
				if(ps[i].Y==2){
					prv=ps[i].X;
				}else if(ps[i].Y==1){
					re[ps[i].X]=re[prv]=cnt++;
				}else{
					vs.pb(ps[i].X);
					if(vs.size()==4){
						re[vs[0]]=re[vs[2]]=cnt++;
						re[vs[1]]=re[vs[3]]=cnt++;
						vs.clear();
					}
				}
				out(i,vs,prv,cs[i],1);
			}
			out(ps,1);
			assert(vs.size()==2);
			re[vs[0]]=re[ps[ps.size()-tail].X]=cnt++;
			re[vs[1]]=re[id+1]=cnt++;
			re[id]=re[id+idd]=cnt++;
			re[id+2]=re[ps[ps.size()-tail+1].X]=cnt++;
			reps(i,ps.size()-tail+2,ps.size())if((i-(ps.size()-tail+1))/2%2==0){
				re[ps[i].X]=re[ps[i+2].X]=cnt++;
				//楽しくなってきた
			}
			reps(i,3,idd)if((i-3)/2%2==0){
				re[id+i]=re[id+i+2]=cnt++;
			}
				out(re,1);
		return re;
		}
		if(head%4==1 || tail%4==1); else NO(2);
		if(tail%4!=1){
			reverse(all(s));
			return solve(s.substr(1,n-2));
		}
		vector<int> vs;
		int prv;
		rep(i,ps.size()-tail-1){
			if(ps[i].Y==2){
				prv=ps[i].X;
			}else if(ps[i].Y==1){
				re[ps[i].X]=re[prv]=cnt++;
			}else{
				vs.pb(ps[i].X);
				if(vs.size()==4){
					re[vs[0]]=re[vs[2]]=cnt++;
					re[vs[1]]=re[vs[3]]=cnt++;
					vs.clear();
				}
			}
			out(i,vs,prv,cs[i],1);
		}
		out(ps,1);
		assert(vs.size()==3);
		re[vs[0]]=re[id+2]=cnt++;
		re[vs[1]]=re[ps[ps.size()-tail].X]=cnt++;
		re[vs[2]]=re[id+1]=cnt++;
		re[prv]=re[ps[ps.size()-tail-1].X]=cnt++;
		re[id]=re[id+idd]=cnt++;
		reps(i,ps.size()-tail+1,ps.size())if((i-(ps.size()-tail+1))/2%2==0){
			re[ps[i].X]=re[ps[i+2].X]=cnt++;
			//楽しくなってきた
		}
		reps(i,3,idd)if((i-3)/2%2==0){
			re[id+i]=re[id+i+2]=cnt++;
		}
		out(re,1);
		return re;
	}
	out(2,1);
	vector<int> vs;
	int prv;
	rep(i,ps.size()){
		// if(id>=0 && abs(ps[i].X-id)<=1) continue;
		if(ps[i].Y==2){
			prv=ps[i].X;
		}else if(ps[i].Y==1){
			re[ps[i].X]=re[prv]=cnt++;
		}else{
			vs.pb(ps[i].X);
			if(vs.size()==4){
				re[vs[0]]=re[vs[2]]=cnt++;
				re[vs[1]]=re[vs[3]]=cnt++;
				vs.clear();
			}
		}
	}
	out(s3,id,ps,vs,1);
	assert(id<0 || vs.size()==(idd-1)%4);
	if(s3%4){
		rep(i,vs.size()) re[vs[i]]=re[id+1+i]=cnt++;
		re[id]=re[id+idd]=cnt++;
		reps(i,vs.size()+1,idd){
			if((i-vs.size()-1)/2%2) continue;
			re[id+i]=re[id+i+2]=cnt++;
		}
	}
	out(re,1);
	return re;
}
int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
	auto getS=[](vector<int> ds){
		int n=ds.size();
		vector<int> to(n);
		rep(i,n)rep(j,i)if(ds[i]==ds[j]){
			to[i]=j;
			to[j]=i;
		}
		string s(n-1,'0');
		for(int i=0;i<n;++i){
			i=to[i];
			if(i+1<n) s[i]='1';
		}
		return s;
	};
	if(0){rep(_,100){
		const int n=14;
		vector<int> ds(n);
		rep(i,n) ds[i]=i/2;
		random_shuffle(all(ds));
		string s=getS(ds);
		out(ds,s,1);
		auto re=solve(s);
		if(getS(re)!=s){
			out("BUG",1);
			out(s,ds,re,1);
			return 0;
		}
	}
	return 0;
	}
	int n;
	string s;
	cin>>n>>s;
	auto re=solve(s);
	cout<<"Yes"<<endl;
	//assert(getS(re)==s);
	n=re.size();
	rep(i,n-1) cout<<re[i]+1<<" \n"[i+1==n-1];
  return 0;
}
// ds = {1,2,3,2,0,4,1,4,3,0,}
// , s = 100101100, 
// No
// ds = {2,1,1,2,6,4,5,3,0,6,4,5,0,3,}
// , s = 0001111011110, 
// s = 0000111000011, ds = {4,1,2,1,4,0,6,3,5,5,2,3,0,6,}
// , re = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,}
// , 
// 1 1110111011
