#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <ctype.h>
#include <deque>
#include <cstring>
#include <set>
#include <bitset>
#include <map>
#include <chrono>
#include <random>
#include <unordered_map>
#include <stdio.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef std::vector<int> vi;
typedef std::vector<bool> vb;
typedef std::vector<string> vs;
typedef std::vector<double> vd;
typedef std::vector<long long> vll;
typedef std::vector<std::vector<int> > vvi;
typedef vector<vll> vvll;
typedef std::vector<std::pair<int, int> > vpi;
typedef vector<vpi> vvpi;
typedef std::pair<int, int> pi;
typedef std::pair<ll, ll> pll;
typedef std::vector<pll> vpll;
 
const long long mod = 1000000007;
const unsigned gen_seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937_64 gen(gen_seed);
 
#define all(c) (c).begin(),(c).end()
#define forn(i, a, b) for(int i = a; i < b; i++)
#define read(x) scanf("%d", &x)
#define readv(x, n) vi x(n); forn(i,0,n) scanf("%d", &x[i])
 
#define pb push_back
#define mp make_pair
 
vi go(int n, string s) {
    int rev = 0;
    if(s[0] == '0' && s.back() == '1') {
        reverse(all(s));
        rev = 1;
    }
    s = "1" + s + "1";
    deque<deque<int>> gr11(1);
    int cnt11 = 0;
    vi a10, a01;
    vi a00;
    forn(i,0,2*n) {
        if(s[i] == '1' && s[i+1] == '1') {
            gr11.back().pb(i);
            cnt11++;
        }
        else if(!gr11.back().empty()) gr11.pb(deque<int>());
        if(s[i] == '1' && s[i+1] == '0') a10.pb(i);
        if(s[i] == '0' && s[i+1] == '1') a01.pb(i);
        if(s[i] == '0' && s[i+1] == '0') a00.pb(i);
    }
    if(gr11.back().empty()) gr11.pop_back();
    if(cnt11%2 != 0) {
//        cout<<"No";
        return vi();
    }
    vi pr(2*n, -1);
    int cnt = 1;
    vi ans(2*n, -1);
    for(int i = 0; i<a00.size(); i+=2) {
        ans[a00[i]] = cnt;
        ans[a00[i+1]] = cnt++;
    }
    forn(i,0,a10.size()) {
        ans[a10[i]] = cnt;
        ans[a01[i]] = cnt++;
    }
    if(gr11.size() <= 2 && gr11.size() >= 1 && gr11[0][0] == 0 && gr11.back().back() == 2*n-1 && cnt11%4 == 2) {
//        cout<<"No";
        return vi();
    }
    if(gr11.size() == 1 && cnt11%4==2) {
        return vi();
    }
    if(cnt11 %4 == 2) {
        int u = gr11[0][0];
        int v = gr11[1][0];
        int ru = gr11[0].back()+1;
        int rv = gr11[1].back()+1;
        ans[u] = cnt;
        ans[v] = cnt++;
        swap(ans[ru], ans[rv]);
        gr11[0].pop_front();
        gr11[1].pop_front();
        swap(gr11[0], gr11[1]);
        if(gr11[1].empty()) swap(gr11[0], gr11[1]);
        while(!gr11.empty() && gr11[0].empty()) gr11.pop_front();
    }
    vi ag;
    for(auto x : gr11) for(auto y : x) ag.pb(y);
    for(int i = 0; i < ag.size(); i+=4) {
        ans[ag[i]] = cnt;
        ans[ag[i+2]] = cnt++;
        ans[ag[i+1]] = cnt;
        ans[ag[i+3]] = cnt++;
    }
//    while(1) {
//        if(gr11.size() > 3 || (gr11.size() == 3 && (gr11[0].size() > 1 || gr11[1].size() > 1 || gr11[2].size()%4 == 0))) {
//            int u = gr11[0][0];
//            int v = gr11[1][0];
//            int ru = gr11[0].back()+1;
//            int rv = gr11[1].back()+1;
//            ans[u] = cnt;
//            ans[v] = cnt++;
//            swap(ans[ru], ans[rv]);
//            gr11[0].pop_front();
//            gr11[1].pop_front();
//            if(gr11[1].empty()) swap(gr11[0], gr11[1]);
//            while(gr11[0].empty()) gr11.pop_front();
//        }
//        else if(gr11.size() == 3) {
//            int u = gr11[0][0];
//            int v = gr11[2][0];
//            int ru = gr11[0].back()+1;
//            int rv = gr11[2].back()+1;
//            ans[u] = cnt;
//            ans[v] = cnt++;
//            swap(ans[ru], ans[rv]);
//            gr11[0].pop_front();
//            gr11[2].pop_front();
//            gr11.pop_front();
//        }
//        else if(gr11.size() == 2 && gr11[0].size() > 1 && gr11[1].size() > 1){
//            int u = gr11[0][0];
//            int v = gr11[1][0];
//            int ru = gr11[0].back()+1;
//            int rv = gr11[1].back()+1;
//            ans[u] = cnt;
//            ans[v] = cnt++;
//            swap(ans[ru], ans[rv]);
//            gr11[0].pop_front();
//            gr11[1].pop_front();
//        }
//        else if(gr11.size() == 2) {
//            forn(j,0,2){
//                while(gr11[j].size() > 4) {
//                    ans[gr11[j][0]] = cnt;
//                    ans[gr11[j][2]] = cnt++;
//                    ans[gr11[j][1]] = cnt;
//                    ans[gr11[j][3]] = cnt++;
//                    forn(it,0,4) gr11[j].pop_front();
//                }
//            }
//            if(gr11[0].size() == 1 && gr11[1].size() == 1) {
//                int u = gr11[0][0];
//                int v = gr11[1][0];
//                int ru = gr11[0].back()+1;
//                int rv = gr11[1].back()+1;
//                ans[u] = cnt;
//                ans[v] = cnt++;
//                swap(ans[ru], ans[rv]);
//            }
//            else if(gr11[0].size() == 1) {
//                ans[gr11[0][0]] = cnt;
//                ans[gr11[1][1]] = cnt++;
//                ans[gr11[1][0]] = cnt;
//                ans[gr11[1][2]] = cnt++;
//            }
//            else{
//                ans[gr11[1][0]] = cnt;
//                ans[gr11[0][1]] = cnt++;
//                ans[gr11[0][0]] = cnt;
//                ans[gr11[0][2]] = cnt++;
//            }
//            break;
//        }
//        else if(gr11.size() == 1) {
//            for(int i = 0; i < gr11[0].size(); i+=4) {
//                ans[gr11[0][i]] = cnt;
//                ans[gr11[0][i+2]] = cnt++;
//                ans[gr11[0][i+1]] = cnt;
//                ans[gr11[0][i+3]] = cnt++;
//            }
//            break;
//        }
//        else if(gr11.empty()) break;
//    }
    
    if(rev) {
        reverse(all(ans));
    }
    return ans;
}
 
string from(int n, vi ans) {
    string fr(2*n-1, '0');
    int cur = 0;
    map<int, vi> to;
    forn(i,0,2*n) to[ans[i]].pb(i);
    vi pr(2*n,0);
    for(auto x : to) {
        pr[x.second[0]] = x.second[1];
        pr[x.second[1]] = x.second[0];
    }
    while(1) {
        cur = pr[cur];
        if(cur == 2*n - 1) break;
        fr[cur++] = '1';
    }
    return fr;
}
 
int main()
{
    int n;
    scanf("%d\n", &n);
    string s;
    getline(cin, s);
    
//    n = 6;
//    int bit = 2*n-1;
//    forn(i,0,1<<bit) {
//        int m = i;
//        string s;
//        forn(j,0,bit) {
//            s.pb('0'+m%2);
//            m/=2;
//        }
//        vi ans = go(n,s);
//        if(!ans.empty()) {
//            string res = from(n, ans);
////            cout<<s<<endl<<res<<endl<<endl;
//            if(res != s) {
//            cout<<s<<endl<<res<<endl<<endl;                
//                return 0;
//            }
//        }
////        else cout<<s<<endl<<"-1\n\n";
//    }
//    
//    return 0;
    
    vi ans = go(n,s);
//    cout << from(n, ans)<<endl;
    if(ans.empty()) {
        printf("No");
    }
    else {
        printf("Yes\n");
        for(auto x : ans) printf("%d ", x);
    }
    
}