#include<bits/stdc++.h>
using namespace std ;
#define N 500010
#define M 4000000
vector <char > c[N];
vector <int > a[N<<1 ],g[M];
int num,nx[N<<1 ][2 ],w[N<<1 ],w2[N<<1 ];
int i,j,k,n,m,p,pos[N],pr[N<<1 ],sf[N<<1 ],l;
int Rt=1 ;
char s[N];
inline void Insert(int & x,int y,int z){
if (!x)x=++num;
if (y==l){
a[x].push_back(z);
return ;
}
Insert(nx[x][s[y]-'0' ],y+1 ,z);
}
inline void Build(int x,int y,int z){
if (!x)return ;
int X=++num,Y=++num;
if (a[x].size()==0 ){
pr[x]=X;sf[x]=Y;
}else {
pr[x]=++num;sf[x]=++num;
for (int i=0 ;i<a[x].size();i++){
w[a[x][i]]=++num;
g[num].push_back(a[x][i]^1 );
if (!i)g[pr[x]].push_back(num);else g[w[a[x][i-1 ]]].push_back(num);
if (i==(int )a[x].size()-1 )g[num].push_back(X);
w2[a[x][i]]=++num;g[num].push_back(a[x][i]^1 );
}
for (int i=0 ;i<a[x].size();i++){
if (i==(int )a[x].size()-1 )g[Y].push_back(w2[a[x][i]]),g[a[x][i]].push_back(X);
else g[a[x][i]].push_back(w[a[x][i+1 ]]),g[w2[a[x][i+1 ]]].push_back(w2[a[x][i]]);
if (!i)g[w2[a[x][i]]].push_back(sf[x]),g[a[x][i]].push_back(sf[x]);else g[a[x][i]].push_back(w2[a[x][i-1 ]]);
}
}
if (y)g[y].push_back(pr[x]),g[sf[x]].push_back(z);
Build(nx[x][0 ],X,Y);Build(nx[x][1 ],X,Y);
}
bool b[M];
int cnt;
int f[M],dfn[M],low[M],T,st[M],top;
inline void Dfs(int x){
dfn[x]=low[x]=++T;st[++top]=x;
for (int i=0 ;i<g[x].size();i++){
int v=g[x][i];
if (!dfn[v])Dfs(v),low[x]=min(low[x],low[v]);else
if (!f[v])low[x]=min(low[x],dfn[v]);
}
if (low[x]==dfn[x]){
++cnt;
while (st[top]!=x)f[st[top--]]=cnt;
f[st[top--]]=cnt;
}
}
inline bool Tarjan(){
for (int i=2 ;i<=num;i++)
if (!dfn[i])Dfs(i);
for (int i=1 ;i<=n;i++)
if (f[i<<1 ]==f[i<<1 |1 ])return 0 ;
return 1 ;
}
int main(){
freopen("binary.in" ,"r" ,stdin);
freopen("binary.out" ,"w" ,stdout);
scanf ("%d" ,&n);
memset (pos,-1 ,sizeof (pos));num=n<<1 |1 ;
for (i=1 ;i<=n;i++){
scanf ("%s" ,s);l=strlen (s);
for (j=0 ;j<l;j++){
if (s[j]=='?' )pos[i]=j;
c[i].push_back(s[j]);
}
if (pos[i]==-1 )Insert(Rt,0 ,i<<1 |1 ),g[i<<1 ].push_back(i<<1 |1 );else {
s[pos[i]]='0' ;Insert(Rt,0 ,i<<1 |1 );
s[pos[i]]='1' ;Insert(Rt,0 ,i<<1 );
}
}
Build(1 ,0 ,0 );
if (!Tarjan())puts ("NO" );else {
puts ("YES" );
for (i=1 ;i<=n;i++){
for (j=0 ;j<c[i].size();j++)
if (c[i][j]=='?' )putchar ((f[i<<1 ]<f[i<<1 |1 ])+'0' );else putchar (c[i][j]);
putchar ('\n' );
}
}
return 0 ;
}