#include<bits/stdc++.h>
using namespace std;
const int NY=500005,N=10000005;
//关于编号
//1-n为?填0的
//n+1-2*n为前缀都不选
//2*n+1-3*n为后缀都不选
//3*n+1-4*n为前缀选择
//4*n+1-5*n为?填1的
//5*n+1-8*n类似
int n;
string ac[NY],bc[NY];
int fn[NY],ans[NY];
int ff(int x){
if(x<=n) return x+4*n;
else return x-4*n;
}
int head[N*2],ne[N*4],v[N*4],tot1=1;
void add(int x,int y){ne[++tot1]=head[x]; head[x]=tot1; v[tot1]=y;}
//tarjan
int dfn[N],low[N],vis[N],sta[N],top=0,scc[N],scccnt=0,cnt=0;
void tarjan(int u){
dfn[u]=low[u]=++cnt; sta[++top]=u; vis[u]=1;
for(int i=head[u];i;i=ne[i]){
if(!dfn[v[i]]){
tarjan(v[i]);
low[u]=min(low[u],low[v[i]]);
}
else if(vis[v[i]]) low[u]=min(low[u],dfn[v[i]]);
}
if(dfn[u]==low[u]){
scccnt++;
while(top&&sta[top+1]!=u){
scc[sta[top]]=scccnt;
vis[sta[top]]=0; top--;
}
}
}
//trie
int trie[NY][3],tot=1,num[N];
int visd[NY];
vector<int>vc[NY];
void ins(string a,int id){
int d=1;
for(int i=0;i<a.length();i++){
int dw=a[i]-'0';
if(!trie[d][dw]) trie[d][dw]=++tot;
d=trie[d][dw];
}
num[id]=d;
vc[d].push_back(id);
}
void dfs(string a,int id){
int d=1;
for(int i=0;i<a.length()-1;i++){
int dw=a[i]-'0';
d=trie[d][dw];
if(vc[d].size()){
// cout<<id<<" "<<vc[d][vc[d].size()-1]<<endl;
add(id,vc[d][vc[d].size()-1]+n);
add(vc[d][vc[d].size()-1]+3*n,ff(id));
}
}
}
//add
void addz(int l,int r){
for(int i=l;i<=r;i++){
int fa=num[i];
// cout<<i<<" "<<fa<<endl;
if(visd[fa]) continue;
visd[fa]=1;
for(int j=0;j<vc[fa].size();j++){
int la=0,en=0,d=vc[fa][j];
add(d+n,ff(d)); add(d+2*n,ff(d)); add(d,d+3*n);
if(j-1>=0){
la=vc[fa][j-1];
add(d+n,la+n); add(d,la+n);
add(la+3*n,d+3*n);
}
if(j+1<vc[fa].size()){
en=vc[fa][j+1];
add(d+2*n,en+2*n);
add(d,en+2*n);
}
}
}
}
void addt(int l,int r){
for(int i=l;i<=r;i++){
if(i<=n) dfs(ac[i],i);
else dfs(bc[i-4*n],i);
}
}
int main(){
scanf("%d", &n);
for(int i=1;i<=n;i++){
cin>>ac[i];
bc[i]=ac[i];
for(int j=0;j<ac[i].length();j++){
if(ac[i][j]=='?'){
fn[i]=1;
ac[i][j]='0';
bc[i][j]='1';
}
}
ins(ac[i],i); ins(bc[i],i+4*n);
}
addz(1,n); addz(4*n+1,5*n);
addt(1,n); addt(4*n+1,5*n);
for(int i=1;i<=8*n;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++){
if(scc[i]==scc[i+4*n]&&fn[i]){
cout<<"NO"<<endl;
return 0;
}
else if(scc[i]<scc[i+4*n]) ans[i]=1;
else ans[i]=2;
}
cout<<"YES"<<endl;
for(int i=1;i<=n;i++){
if(ans[i]==1) cout<<ac[i]<<endl;
else cout<<bc[i]<<endl;
}
return 0;
}