#include<bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

const int MN = 100010;

int N;
string S, T;
int ans[MN << 1];
vector<vector<int> > door;
int dcnt;

void print() {
    printf("Yes\n");

    for(int i = 0; i < 2 * N; i++) {
        printf("%d ", ans[i] + 1);
    }
}
void solve(int t) {
    for(int i = 0; i < door[t].size() / 4; i++) {
        ans[ door[t][4 * i] ] = dcnt;
        ans[ door[t][4 * i + 1] ] = dcnt + 1;
        ans[ door[t][4 * i + 2] ] = dcnt;
        ans[ door[t][4 * i + 3] ] = dcnt + 1;
        dcnt += 2;
    }
    int rem = 2;
    for(int i = 0; i < 2 * N; i++) if(ans[i] == -1) {
        ans[i] = dcnt;
        rem--;
        if(!rem) {
            dcnt++;
            rem = 2;
        }
    }
    print();
}

int main() {
    cin >> N >> S;
    S += '1';

    memset(ans, -1, sizeof(ans));

    int p = -1;
    for(int i = 0; i < S.size(); i++) {
        if(S[i] == '0') {
            p = i;
            break;
        }
    }

    if(p == -1) {
        if(N % 2) printf("No");
        else {
            printf("Yes\n");
            for(int i = 0; i < N / 2; i++) {
                for(int j = 0; j < 2; j++) {
                    printf("%d %d ", 2 * i + 1, 2 * i + 2);
                }
            }
        }
        return 0;
    }

    for(int i = 1; i < 2 * N; i++) {
        int cur = (p + i) % (2 * N);
        int pre = (p + i - 1) % (2 * N);

        if(S[pre] == '0' && S[cur] == '1') {
            door.push_back(vector<int>());
        }
        if(S[cur] == '1' || S[pre] == '1') door.back().push_back(cur);
    }
    if(S[ (p + 2 * N - 1) % (2 * N) ] == '1') door.back().push_back(p);

    /*
    for(int i = 0; i < door.size(); i++) {
        for(int j = 0; j < door[i].size(); j++) {
            cout << door[i][j] << ' ';
        }
        cout << endl;
    }
    //*/

    int gcnt = 0;
    for(int i = 0; i < door.size(); i++) {
        gcnt += (int)door[i].size() - 2;
    }
    if(gcnt % 2) {
        printf("No");
        return 0;
    }
    if(gcnt % 4 == 0) {
        for(int i = 1; i < door.size(); i++) {
            ans[ door[0].back() ] = dcnt;
            ans[ door[i][0] ] = dcnt;
            dcnt++;

            door[0].pop_back();
            for(int j = 1; j < door[i].size(); j++) door[0].push_back(door[i][j]);
        }

        ans[ door[0].back() ] = dcnt;
        ans[ door[0][0] ] = dcnt;
        dcnt++;

        door[0].pop_back();
        door[0].erase(door[0].begin());

        solve(0);
        return 0;
    }

    vector<int> X;
    for(int i = 0; i < door.size(); i++) {
        if(X.size() == 2) break;
        if(door[i].size() > 2) {
            X.push_back(i);
        }
    }
    if(X.size() < 2) {
        printf("No");
        return 0;
    }


    for(int i = 0; i < door.size(); i++) {
        if(i == X[0] || i == X[1]) continue;

        ans[ door[ X[0] ].back() ] = dcnt;
        ans[ door[i][0] ] = dcnt;
        dcnt++;

        door[ X[0] ].pop_back();
        for(int j = 1; j < door[i].size(); j++) {
            door[ X[0] ].push_back(door[i][j]);
        }
    }
    for(int i = 0; i < 2; i++) {
        ans[ door[ X[i] ].back() ] = dcnt;
        ans[ door[ X[i] ][0] ] = dcnt;
        dcnt++;

        door[ X[i] ].pop_back();
        door[ X[i] ].erase(door[ X[i] ].begin());
    }

    ans[ door[ X[0] ].back() ] = dcnt;
    ans[ door[ X[1] ][0] ] = dcnt;
    dcnt++;

    door[ X[0] ].pop_back();
    door[ X[1] ].erase(door[ X[1] ].begin());

    for(int i = 0; i < door[ X[1] ].size(); i++) {
        door[ X[0] ].push_back(door[ X[1] ][i]);
    }

    solve(X[0]);
}


Measured memory_bytes: 5688