#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n;
int s[maxn << 1];
bool vst[maxn << 1];
int door[maxn << 1];
int cnt, cntt, one;
int in[maxn << 1], out[maxn << 1];
vector<int> v[4];
bool dfs(int i) {
  if (i == ((n << 1) + 1)) {
    if (cnt == (n - v[0].size() / 2) && cntt == one)
      return true;
    else
      return false;
  }
  if (out[i]) return false;
  if (in[i]) {
    int j = in[i];
    out[i] = j;
    in[j] = i;
    bool change = 0;
    if (s[j] && !vst[j]) {
      vst[j] = 1;
      ++cntt;
      change = 1;
    }
    if (dfs(j + 1)) return true;
    if (change) {
      vst[j] = 0;
      --cntt;
    }
    out[i] = in[j] = 0;
    return false;
  }
  int x = (s[i - 1] << 1) + s[i];
  x = (-x) % 3 + 3;
  int sz = v[x].size();
  for (int k = 0; k < sz; ++k) {
    int j = v[x][k];
    if ((!in[j]) && i != j && (!out[j])) {
      door[i] = door[j] = ++cnt;
      in[j] = i;
      out[i] = j;
      bool change = 0;
      if (s[j] && !vst[j]) {
        vst[j] = 1;
        ++cntt;
        change = 1;
      }
      if (dfs(j + 1)) return true;
      if (change) {
        vst[j] = 0;
        --cntt;
      }
      --cnt;
      door[i] = door[j] = 0;
      in[j] = out[i] = 0;
    }
  }
  return false;
}
int main() {
  cnt = cntt = one = 0;
  memset(door, 0, sizeof(door));
  memset(in, 0, sizeof(in));
  memset(out, 0, sizeof(out));
  scanf("%d", &n);
  s[0] = 1;
  for (int i = 1; i < (n << 1); ++i) {
    scanf("%1d", &s[i]);
    if (s[i]) ++one;
    int x = (s[i - 1] << 1) + s[i];
    v[x].push_back(i);
  }
  int x = (s[(n << 1) - 1] << 1) + 1;
  v[x].push_back(n << 1);
  if (dfs(1)) {
    printf("Yes\n");
    int sz = v[0].size();
    for (int i = 0; i < sz; ++i) {
      door[v[0][i]] = cnt + 1 + i / 2;
    }
    for (int i = 1; i <= (n << 1); ++i) {
      printf("%d ", door[i]);
    }
  } else
    printf("No\n");
  return 0;
}
