#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int n, a[N], cnt[N], ans[N], to[N], c;
char s[N];
void reg(int *b) {
  static int p[N];
  for (int i = 1; i <= n; ++i) p[i] = 0;
  for (int i = 1; i <= 2 * n; ++i)
    if (b[i]) {
      if (p[b[i]])
        to[i] = p[b[i]], to[to[i]] = i;
      else
        p[b[i]] = i;
    }
}
static bool jud(int *b) {
  static int c[N], v[N];
  for (int i = 1; i <= n; ++i) c[i] = 0;
  for (int i = 1; i <= 2 * n; ++i) c[b[i]]++, v[i] = 0;
  for (int i = 1; i <= n; ++i)
    if (c[i] != 2) return 0;
  reg(b);
  int x = 1;
  while (x != 2 * n + 1) {
    v[to[x]] = 1;
    x = to[x] + 1;
  }
  for (int i = 1; i <= 2 * n - 1; ++i)
    if (v[i] != a[i]) return 0;
  return 1;
}
void dfs(int x) {
  static int b[N];
  if (x > 2 * n) {
    if (!jud(b)) return;
    printf("Yes\n");
    for (int i = 1; i <= 2 * n; ++i) printf("%d ", b[i]);
    printf("\n");
    exit(0);
    return;
  }
  for (int i = 1; i <= n; ++i)
    if (cnt[i] != 2) {
      cnt[i]++;
      b[x] = i;
      dfs(x + 1);
      cnt[i]--;
    }
}
bool can() {
  static int ansg[N], qq[N];
  qq[0] = 0;
  int c1 = c;
  for (int i = 1; i <= 2 * n; ++i)
    if (!ans[i])
      qq[++qq[0]] = i;
    else
      ansg[i] = ans[i];
  for (int i = 1; i <= qq[0]; i += 4) {
    ansg[qq[i]] = ansg[qq[i + 2]] = ++c1;
    ansg[qq[i + 1]] = ansg[qq[i + 3]] = ++c1;
  }
  if (!jud(ansg)) return 0;
  printf("Yes\n");
  for (int i = 1; i <= 2 * n; ++i) printf("%d ", ansg[i]);
  printf("\n");
  return 1;
}
int main() {
  scanf("%d%s", &n, s + 1);
  for (int i = 1; i <= 2 * n - 1; ++i) a[i] = s[i] - '0';
  a[0] = a[2 * n] = 1;
  if (n <= 5) {
    dfs(1);
    printf("No\n");
    return 0;
  }
  for (int i = 1, l = 1, r = n; i <= 2 * n; i = ++l)
    if (!a[i]) {
      while (!a[l + 1]) ++l;
      ans[i] = ans[l + 1] = ++c;
      for (int j = i + 1; j <= l; ++j) {
        if (cnt[r] == 2) r--;
        cnt[ans[j] = r]++;
      }
    }
  reg(ans);
  static int q[N];
  for (int i = 1; i <= 2 * n; ++i)
    if (!ans[i]) q[++q[0]] = i;
  if (q[0] & 1) return 0 * printf("No\n");
  if (q[0] % 4) {
    bool flag = 0;
    for (int i = 1; i <= q[0]; ++i)
      if (to[q[i] - 1] && to[q[i] + 1]) {
        int x = q[i] - 1, y = q[i] + 1;
        int x1 = to[x], y1 = to[y];
        swap(ans[x], ans[y1]);
        ans[q[i]] = ++c;
        ans[q[(i == q[0] ? i - 1 : i + 1)]] = c;
        if (can()) return 0;
        swap(ans[x], ans[y1]);
        ans[q[i]] = 0;
        ans[q[(i == q[0] ? i - 1 : i + 1)]] = 0;
        c--;
      }
    ans[q[1]] = ans[q[3]] = ++c;
    ans[q[2]] = ans[q[5]] = ++c;
    ans[q[4]] = ans[q[6]] = ++c;
    for (int j = 1; j <= 6; ++j)
      for (int k = 1; k <= 6; ++k)
        if (to[q[j] - 1] && to[q[k] + 1]) {
          int x = q[j] - 1, y = to[q[k] + 1];
          swap(ans[x], ans[y]);
          static int tt[N];
          for (int i = 1; i <= 2 * n; ++i) tt[i] = to[i];
          if (can()) return 0;
          swap(ans[x], ans[y]);
          for (int i = 1; i <= 2 * n; ++i) to[i] = tt[i];
        }
  }
  can() ? 0 : puts("No");
}
