#include<bits/stdc++.h>
using namespace std;
const int N = 3001,M = 3001;
int n,m;
struct My_Str{
char str2[M];
}s[N];
bool cmp(char c1,char c2){
return c1 > c2;
}
struct node{
int child[26];
int Min;
}t[N * M];
int Min[N * M];
int tot;
void insert(char S[]){
int u = 0;
for(int i = 1;i <= m;i++){
int tmp = S[i] - 'a';
Min[u] = min(Min[u],tmp);
if(!t[u].child[tmp])
t[u].child[tmp] = ++tot;
u = t[u].child[tmp];
}
}
bool find(char S[]){
int u = 0;
for(register int i = 1;i <= m;i++){
int tmp = S[i] - 'a';
if(tmp > Min[u])
return false;
if(tmp < Min[u])
return true;
u = t[u].child[tmp];
}
return true;
}
char str[M],tmp_str[M];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
memset(Min,0x3f,sizeof Min);
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> str + 1;
for(int j = 1;j <= m;j++){
s[i].str2[j] = str[j];
tmp_str[j] = str[j];
}
sort(s[i].str2 + 1,s[i].str2 + m + 1);
sort(tmp_str + 1,tmp_str + m + 1,cmp);
insert(tmp_str);
}
if(n == 1){
cout << 1;
return 0;
}
for(int i = 1;i <= n;i++){
if(find(s[i].str2))
cout << 1;
else
cout << 0;
}
return 0;
}