#include <bits/stdc++.h>
using namespace std;
int A[200005];
char str[200005];
int to[200005], back[200005];
int L[200005], R[200005];
bool use[200005];
int n;
int sz;
string S;
bool check() {
  memset(L, -1, sizeof(L));
  memset(R, -1, sizeof(R));
  for (int i = 0; i < 2 * n; i++) {
    int v = A[i];
    if (L[v] == -1)
      L[v] = i;
    else
      R[v] = i;
  }
  memset(use, false, sizeof(use));
  int now = 0;
  while (now != 2 * n) {
    use[now] = true;
    int v = A[now];
    if (L[v] == now)
      now = R[v] + 1;
    else
      now = L[v] + 1;
  }
  for (int i = 0; i < 2 * n; i++) {
    if (S[i] == '1' && !use[i]) {
      return false;
    }
    if (S[i] == '0' && use[i]) {
      return false;
    }
  }
  return true;
}
void unite(int s, int t) {
  A[s] = A[t] = sz;
  sz++;
  to[s] = t + 1;
  to[t] = s + 1;
  back[t + 1] = s;
  back[s + 1] = t;
}
int main() {
  scanf("%d", &n);
  scanf("%s", &str);
  S = "1";
  S += str;
  S += "1";
  if (n <= 5) {
    for (int i = 0; i < 2 * n; i++) A[i] = i / 2;
    do {
      if (A[0] != 0) break;
      if (check()) {
        puts("Yes");
        for (int i = 0; i < 2 * n; i++) {
          if (i != 0) printf(" ");
          printf("%d", A[i] + 1);
        }
        puts("");
        return 0;
      }
    } while (next_permutation(A, A + 2 * n));
    puts("No");
    return 0;
  }
  memset(to, -1, sizeof(to));
  memset(back, -1, sizeof(back));
  memset(A, -1, sizeof(A));
  for (int i = 0; i + 4 <= 2 * n; i++) {
    if (S[i] == '1' && S[i + 1] == '1' && S[i + 2] == '1' && S[i + 3] == '1' &&
        S[i + 4] == '1') {
      unite(i, i + 2);
      unite(i + 1, i + 3);
      S[i] = '0';
      S[i + 1] = '0';
      S[i + 2] = '0';
      S[i + 3] = '0';
    }
  }
  int cnt = 0;
  vector<int> vec;
  for (int i = 0; i < S.size() - 1; i++) {
    if (S[i] == '1' && S[i + 1] == '1') {
      cnt++;
      vec.push_back(i);
    }
  }
  if (cnt % 2 == 1) {
    puts("No");
    return 0;
  }
  if (cnt == 2) {
    for (int i = 1; i < S.size() - 1; i++) {
      if (S[i - 1] == '1' && S[i] == '1' && S[i + 1] == '1') {
        puts("No");
        return 0;
      }
    }
  }
  int l = -1;
  for (int i = 0; i < S.size(); i++) {
    if (S[i] == '1') {
      l = i;
      break;
    }
  }
  if (l != -1) {
    int r = -1;
    for (int i = l; i < S.size(); i++) {
      if (S[i] == '0') {
        r = i;
        break;
      }
    }
    if (r == -1) {
      puts("No");
      return 0;
    }
    l = r, r = -1;
    for (int i = l; i < S.size(); i++) {
      if (S[i] == '1') {
        r = i;
        break;
      }
    }
    l = r, r = -1;
    for (int i = l; i < S.size(); i++) {
      if (S[i] == '0') {
        r = i;
        break;
      }
    }
    if (r == -1) {
      puts("No");
      return 0;
    }
  }
  for (int i = 0; i < 2 * n; i++) {
    if (to[i] != -1) {
      S[i] = '1';
    }
  }
  if (!vec.empty()) {
    int f = vec[0], s = -1;
    int start = 1;
    if (vec.size() >= 2 && vec[2] == 2) {
      unite(0, 2);
      f = 1;
      s = -1;
      start += 2;
    } else if (vec.size() >= 1 && vec[1] == 1) {
      f = 0;
      s = 1;
      start++;
    }
    for (int i = start; i < vec.size(); i++) {
      int t = vec[i];
      if (s == -1) {
        if (i + 1 < vec.size() && vec[i + 1] == t + 1) {
          if (i + 2 < vec.size() && vec[i + 2] == t + 2) {
            unite(f, t + 1);
            i += 2;
            f = t + 2;
            s = t;
          } else {
            unite(f, t + 1);
            i++;
            f = t;
            s = -1;
          }
        } else {
          s = t;
        }
      } else {
        if (i + 1 < vec.size() && vec[i + 1] == t + 1) {
          if (i + 2 < vec.size() && vec[i + 2] == t + 2) {
            unite(f, t);
            unite(s, t + 1);
            i += 2;
            f = t + 2;
            s = -1;
          } else {
            unite(f, t);
            i++;
            f = s;
            s = t + 1;
            swap(f, s);
          }
        } else {
          unite(f, t);
          f = s;
          s = -1;
        }
      }
    }
    unite(f, s);
  }
  vector<pair<int, int> > vx;
  for (int i = 0; i < S.size(); i++) {
    if (S[i] == '1' && back[i] == -1) {
      int f = i - 1;
      int s = i;
      while (to[s] != -1) s = to[s];
      vx.push_back(pair<int, int>(f, s));
    }
  }
  for (int i = 0; i + 1 < vx.size(); i++) {
    pair<int, int> p = vx[i];
    if (p.second == 2 * n) {
      if (i == 0) {
        puts("No");
        return 0;
      }
      swap(vx[i], vx[vx.size() - 1]);
      break;
    }
  }
  for (int i = 0; i + 1 < vx.size(); i++) {
    pair<int, int> p = vx[i], q = vx[i + 1];
    A[q.first] = A[p.second] = sz;
    sz++;
  }
  cnt = 0;
  for (int i = 0; i < 2 * n; i++) {
    if (A[i] == -1) {
      A[i] = sz;
      if (cnt == 1)
        cnt = 0, sz++;
      else
        cnt = 1;
    }
  }
  if (check()) {
    puts("Yes");
    for (int i = 0; i < 2 * n; i++) {
      if (i != 0) printf(" ");
      printf("%d", A[i] + 1);
    }
    puts("");
    return 0;
  }
  puts("No");
  return 0;
}
