Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

w を正整数，p を長さ22w+1 の文字列とする．(w, p)- セルオートマトンとは次のようなものである．

0 または 1 の状態をとることのできるセルが無限個一次元に並んでいる．

時刻 0 に，すぬけ君は好きな有限個のマスを選んで状態を 1 にすることができる．残りのセルは 0 である．

時刻 t (> 0) のセル x の状態 f(t, x) は，f(t − 1, x − w), . . . , f(t − 1, x + w) によって以下のように定まる:

\begin{eqnarray}
f(t, x) = p[ \sum^w_{i=-w}2^{w+i} f(t − 1, x + i)] \;\;\;\;\;\;\;\;\;\;(1)
\end{eqnarray}

すぬけ君は，時刻 0 にどのように初期状態を選んでも 1 の個数が初期状態から変わらないようなセルオートマトンが好きである．整数 w と文字列 s が与えられたとき，辞書順で s 以上の文字列 p であって　(w, p)− セルオートマトンがすぬけ君に好かれるような最小の p を求めよ．

Constraints

1 ≤ w ≤ 3

|s| = 22w+1

s に現れる文字は '0', '1' のみである

Input

w
s

Output

条件を満たす最小の p を出力せよ．そのようなものが存在しないときは "no" と出力せよ．

Sample Input 1

1
00011000

Sample Output 1

00011101

Sample Input 2

1
11111111

Sample Output 2

no

Solution in C++ (judge verdict: Accepted)

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int n;
char in[1000];
char ret[1000];
int dist[1000];
bool check(){
	vector<pair<pair<int,int>,int> >edge;
	for(int i=0;i<(1<<(2*n+1));i++){
		int L,R,to;
		L=0;R=0;to=i/2;
		if(ret[i]=='?'){
			L--;
		}else if(ret[i]=='1'){
			L--;R--;
		}
		edge.push_back(make_pair(make_pair(i*2+1,i*2),R));
		edge.push_back(make_pair(make_pair(i*2,i*2+1),-L));
		
		edge.push_back(make_pair(make_pair(i*2,to*2+1),0));
		edge.push_back(make_pair(make_pair(to*2+1,i*2),0));
		L=0;R=0;to=i/2+(1<<(2*n));
		if(ret[i]=='?'){
			L--;
		}else if(ret[i]=='1'){
			L--;R--;
		}
		edge.push_back(make_pair(make_pair(i*2,to*2+1),1));
		edge.push_back(make_pair(make_pair(to*2+1,i*2),-1));
	}
	for(int i=0;i<(1<<(2*n+2));i++)dist[i]=999999999;
	dist[0]=0;
	for(int i=0;i<=(1<<(2*n+2));i++){
		for(int j=0;j<edge.size();j++){
			if(dist[edge[j].first.first]+edge[j].second<dist[edge[j].first.second]){
				dist[edge[j].first.second]=dist[edge[j].first.first]+edge[j].second;
				if(i==(1<<(n*2+2)))return false;
			}
		}
	}
	return true;
}
int main(){
	int a;scanf("%d",&a);
	n=a;
	scanf("%s",in);
	for(int i=0;i<(1<<(2*a+1));i++)ret[i]=in[i];
	if(check()){
		printf("%s\n",ret);return 0;
	}
	for(int i=(1<<(2*a+1))-1;i>=0;i--){
		ret[i]='?';
		if(in[i]=='0'){
			ret[i]='1';
			if(check()){
				for(int j=i+1;j<(1<<(2*a+1));j++){
					ret[j]='0';
		//			printf("%s\n",ret);
					if(!check())ret[j]='1';
				}
				printf("%s\n",ret);return 0;
			}
			ret[i]='?';
		}
	}
	printf("no\n");
}