#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
const ll mod1 = 1000000007LL;
const ll mod2 = 1000000009LL;
const ll base = 257LL;
struct hashed_string{
public:
string s; ll n;
vector<pair<ll,ll>> prefix;
vector<pair<ll,ll>> pow;
hashed_string(string a){
s = a; n = a.size();
prefix.assign(n, {0,0});
pow.assign(n+1, {0,0});
pow[0] = {1,1};
for (int i = 1; i <= n; i++){
pow[i].first = (pow[i-1].first * base) % mod1;
pow[i].second = (pow[i-1].second * base) % mod2;
}
ll sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++){
ll c = s[i] - 'a' + 1;
sum1 = (sum1 * base + c) % mod1;
sum2 = (sum2 * base + c) % mod2;
prefix[i] = {sum1,sum2};
}
}
hashed_string(){}
pair<ll,ll> get_hash(ll l, ll r){
ll x1 = prefix[r].first;
ll x2 = prefix[r].second;
if (l >= 1){
x1 = (x1 - prefix[l-1].first * pow[r-l+1].first % mod1 + mod1) % mod1;
x2 = (x2 - prefix[l-1].second * pow[r-l+1].second % mod2 + mod2) % mod2;
}
return {x1,x2};
}
};
void solve(){
ll n,k;
cin >> n >> k;
vector<string> l1(n);
vector<hashed_string> v(n);
for (int i = 0; i < n; i++) cin >> l1[i];
if (k <= 2){
for (int i = 0; i < n; i++) cout << (n >= 2 ? '1' : '0');
cout << "\n";
return;
}
for (int i = 0; i < n; i++) v[i] = hashed_string(l1[i]);
string answ = "";
vector<bool> good(n,true);
if (n > k){
vector<pair<pair<ll,ll>,ll>> dp[k][k];
for (int i = 0; i < n; i++){
for (int j = 0; j < k; j++){
for (int x = j+1; x < k; x++){
ll sum1 = 0;
ll sum2 = 0;
if (j > 0){
auto h = v[i].get_hash(0,j-1);
sum1 = h.first;
sum2 = h.second;
}
if (x-j-1 >= 1){
sum1 = sum1 * v[i].pow[x-j-1].first % mod1;
sum2 = sum2 * v[i].pow[x-j-1].second % mod2;
auto h = v[i].get_hash(j+1,x-1);
sum1 = (sum1 + h.first) % mod1;
sum2 = (sum2 + h.second) % mod2;
}
if (k-x-1 >= 1){
sum1 = sum1 * v[i].pow[k-x-1].first % mod1;
sum2 = sum2 * v[i].pow[k-x-1].second % mod2;
auto h = v[i].get_hash(x+1,k-1);
sum1 = (sum1 + h.first) % mod1;
sum2 = (sum2 + h.second) % mod2;
}
dp[j][x].push_back({{sum1,sum2},i});
}
}
}
for (int i = 0; i < k; i++){
for (int j = i+1; j < k; j++){
sort(dp[i][j].begin(),dp[i][j].end());
for (int x = 0; x < n; x++){
if (x >= 1 &&
dp[i][j][x-1].first == dp[i][j][x].first){
good[dp[i][j][x].second] = false;
}
if (x < n-1 &&
dp[i][j][x].first == dp[i][j][x+1].first){
good[dp[i][j][x].second] = false;
}
}
}
}
}
else{
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i != j){
int cnt = 0;
for (int x = 0; x < k; x++){
cnt += (l1[i][x] != l1[j][x]);
}
if (cnt <= 2){
good[i] = false;
}
}
}
}
}
for (int i = 0; i < n; i++){
if (!good[i]) answ += '1';
else answ += '0';
}
cout << answ << "\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--)
solve();
return 0;
}