#include <cstdio>
#include <vector>
void erase(std::vector<int> &vec, int val) { vec.erase(std::lower_bound(vec.begin(), vec.end(), val)); }
int ans[200005];
char str[200005];
std::vector<int> vec_00, vec_01, vec_10, vec_11;
int main()
{
	// freopen("B.in", "r", stdin);
	int n, cur = 0;
	scanf("%d%s", &n, str + 1);
	str[0] = str[n << 1] = '1';
	for (int i = 0; i < n << 1; i++)
	{
		if (str[i] == '0')
			(str[i + 1] == '0' ? vec_00 : vec_01).push_back(i);
		else
			(str[i + 1] == '0' ? vec_10 : vec_11).push_back(i);
	}
	int m = vec_11.size();
	if (m & 1)
	{
		puts("No");
		return 0;
	}
	if (m & 3)
	{
		int a = 0;
		while (a <= n << 1 && str[a] == '1')
			a++;
		if (a > n << 1)
		{
			puts("No");
			return 0;
		}
		while (true)
		{
			while (a < n << 1 && str[a + 1] == '0')
				a++;
			if (a >= n << 1)
			{
				puts("No");
				return 0;
			}
			if (a + 2 <= n << 1 && str[a + 2] == '1')
				break;
			a += 2;
		}
		int b = a + 1;
		while (b <= n << 1 && str[b] == '1')
			b++;
		if (b > n << 1)
		{
			puts("No");
			return 0;
		}
		int pos = 0;
		while (pos < m && vec_11[pos] > a && vec_11[pos] < b - 1)
			pos++;
		if (pos >= m)
		{
			puts("No");
			return 0;
		}
		while (pos + 1 < m && vec_11[pos + 1] < a)
			pos++;
		int x = a, y = b - 1, z = a + 1, w = vec_11[pos];
		ans[x] = ans[y] = cur++;
		erase(vec_01, x);
		erase(vec_10, y);
		ans[z] = ans[w] = cur++;
		erase(vec_11, z);
		erase(vec_11, w);
	}
	for (int i = 0; i < vec_01.size(); i++)
		ans[vec_01[i]] = ans[vec_10[i]] = cur++;
	for (int i = 0; i < vec_00.size(); i += 2)
		ans[vec_00[i]] = ans[vec_00[i + 1]] = cur++;
	for (int i = 0; i < vec_11.size(); i += 4)
	{
		ans[vec_11[i]] = ans[vec_11[i + 2]] = cur++;
		ans[vec_11[i + 1]] = ans[vec_11[i + 3]] = cur++;
	}
	puts("Yes");
	for (int i = 0; i < n << 1; i++)
		printf("%d%c", ans[i] + 1, " \n"[i + 1 == n << 1]);
	return 0;
}
