#include <bits/stdc++.h>
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:336777216")
using namespace std;
int IT_MAX = 1 << 19;
int MOD = 10000000;
const int INF = 0x3f3f3f3f;
const long long LL_INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1);
const double ERR = 1e-10;
const int MX = 200005;
char D[MX];
int ans[MX], C[MX];
vector<int> P, Q, R;
int N;
void solve1() {
  int t = 0;
  for (int i = 0; i < P.size() / 2; i++) {
    ans[P[i]] = ans[P[i + P.size() / 2]] = ++t;
  }
  for (int i = 0; i < Q.size(); i += 2) {
    ans[Q[i]] = ans[Q[i + 1]] = ++t;
  }
  for (int i = 0; i < R.size(); i += 2) {
    ans[R[i]] = ans[R[i + 1]] = ++t;
  }
}
bool solve2() {
  int cnt = -1e9, p = -1, q = -1, r = -1;
  for (int i = 1; i <= 2 * N; i++) {
    if (C[i] == 2)
      cnt = 0, p = i;
    else if (C[i] == 3)
      cnt++;
    else if (C[i] == 1) {
      if (cnt >= 1) {
        q = i;
        break;
      }
      cnt = -1e9;
    }
  }
  int ch = 0;
  for (int i = 1; i <= 2 * N; i++) {
    if (p <= i && i <= q) continue;
    if (C[i] == 3) ch = 1;
  }
  if (q == -1 || !ch) return false;
  for (int i = 0; i < Q.size(); i += 2) {
    if (Q[i] == q) {
      swap(Q[i], Q[i - 2]);
    }
  }
  random_shuffle(P.begin(), P.end());
  int t = 0;
  for (int i = 0; i < P.size() / 2; i++) {
    ans[P[i]] = ans[P[i + P.size() / 2]] = ++t;
  }
  for (int i = 0; i < Q.size(); i += 2) {
    ans[Q[i]] = ans[Q[i + 1]] = ++t;
  }
  for (int i = 0; i < R.size(); i += 2) {
    ans[R[i]] = ans[R[i + 1]] = ++t;
  }
  return true;
}
int main() {
  scanf("%d%s", &N, D + 1);
  D[0] = D[N * 2] = '1';
  for (int i = 1; i <= 2 * N; i++) {
    if (D[i] == '0' && D[i - 1] == '0')
      R.push_back(i), C[i] = 0;
    else if (D[i] == '1' && D[i - 1] == '1')
      P.push_back(i), C[i] = 3;
    else if (D[i] == '1' && D[i - 1] == '0')
      Q.push_back(i), C[i] = 2;
    else if (D[i] == '0' && D[i - 1] == '1')
      Q.push_back(i), C[i] = 1;
  }
  if (P.size() % 2 || Q.size() % 2) return !printf("No\n");
  if (P.size() % 4 == 0)
    solve1();
  else if (!solve2())
    return !printf("No\n");
  else {
    int t;
    for (t = 0; t < 100; t++) {
      solve2();
      int flag[MX] = {};
      int edge[MX] = {};
      for (int i = 1; i <= 2 * N; i++) edge[ans[i]] = flag[i] = 0;
      for (int i = 1; i <= 2 * N; i++) edge[ans[i]] ^= i;
      int cur = 0;
      while (cur < 2 * N) {
        flag[cur] = 1;
        cur++;
        cur ^= edge[ans[cur]];
      }
      int p = 1;
      for (int i = 1; i <= 2 * N - 1; i++) {
        if (D[i] != flag[i] + '0') p = 0;
      }
      if (p) break;
    }
    if (t == 100) return !printf("No\n");
  }
  printf("Yes\n");
  for (int i = 1; i <= 2 * N; i++) printf("%d ", ans[i]);
  printf("\n");
}
