#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 1000000007

void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif

ll binpow(ll x,ll y)/* (x^y)%p in O(log y) */{ll res=1;while (y > 0){if(y&1)res=(res*x);y = y>>1;x=(x*x);}return res;}
ll binpowmod(ll x,ll y,ll p)/* (x^y)%p in O(log y) */{ll res=1;x=x%p;while (y > 0){if(y&1)res=(res*x)%p;y = y>>1;x=(x*x)%p;}return res;}
ll mod_inverse(ll n,ll p)/* Returns n^(-1) mod p */{return binpowmod(n,p-2,p);}
ll gcd(ll x,ll y)
{
    if(y==0)
        return x;
    return gcd(y,x%y);
}
bool comp_pairs_by_s(pair<ll,ll> &x ,pair<ll,ll> &y)
{
    return x.second<y.second;
}
bool isPowerOfTwo (ll x)  
{  
    /* First x in the below expression is for the case when x is 0 */
    return x && (!(x&(x-1)));  
}

class cmp      //comparator for priority_queue 
{               //declaration: priority_queue<int,vector<int>,cmp>
public:         
    bool operator()(pair<int,int> A,pair<int,int> B)
    {
        if(abs(A.first-A.second)==abs(B.first-B.second))
            return A.first>B.first;
        return abs(A.first-A.second)<abs(B.first-B.second);
    }
};
// int prime[10000007]={0};
// void sieve(void)
// {
//  int i,j;
//  for(i=0;i<10000007;i++)
//         prime[i]=1;
//  prime[0]=0,prime[1]=0;
//  for(i=2;i<=sqrt(10000007);i++){
//      if(prime[i]==i){
//          for(j=i*i;j<10000007;j+=i){
//             if(!prime[j])
//                 prime[j]=0;
//          }
//      }
//  }
    
// }
void swap(ll &x,ll &y){
    int temp=x;
    x=y;
    y=temp;
}
  
unsigned int onesComplement(unsigned int n) 
{ 
   // Find number of bits in the given integer 
   int number_of_bits = floor(log2(n))+1; 
  
   // XOR the given integer with poe(2,  
   // number_of_bits-1 and print the result  
   return ((1 << number_of_bits) - 1) ^ n; 
}
bool comp(ll x,ll y)
{
    return abs(x)>abs(y);
}

bool comp1(pair<ll,ll> x,pair<ll,ll> y)
{
    return x.second<y.second;
}

void solve()
{
    int n;
    cin>>n;
    vector<string> s(n);
    vector<int> t(10,n+1);
    vector<int> b(10,-1);
    vector<int> l(10,n+1);
    vector<int> r(10,-1);
    
    for(int i=0;i<n;++i){
        cin>>s[i];
        for(int j=0;j<n;++j){
            t[s[i][j]-'0'] = min(t[s[i][j]-'0'],i);
            b[s[i][j]-'0'] = max(b[s[i][j]-'0'],i);
            l[s[i][j]-'0'] = min(l[s[i][j]-'0'],j);
            r[s[i][j]-'0'] = max(r[s[i][j]-'0'],j);
        }
    }
    for(int i=0;i<10;++i){
        if(t[i] == n+1)
            t[i] = -1;
        if(l[i] == n+1)
            l[i] = -1;
    }

    for(int d=0;d<10;++d){
        int ans = 0;
        for(int i=0;i<n;++i){
            int left = -1;
            int right = -1;
            for(int j=0;j<n;++j){
                if(s[i][j]-'0' == d){
                    left = j; break;
                }
            }
            for(int j=n-1;j>=0;--j){
                if(s[i][j] - '0' == d){
                    right = j; break;
                }
            }
            if(left>=0&&right>=0){
                ans = max(ans , (right-left)*(n-1-i));
                ans = max(ans , (right-left)*i);
            }
            if(left>=0){
                if(t[d]>=0)
                    ans = max(ans , (n-1-left)*abs(i-t[d]));
                if(b[d]>=0)
                    ans = max(ans , (n-1-left)*abs(b[d]-i));
                if(t[d]>=0)
                    ans = max(ans , (left)*abs(i-t[d]));
                if(b[d]>=0)
                    ans = max(ans , (left)*abs(b[d]-i));
            }
            if(right>=0){
                if(t[d]>0)
                    ans = max(ans , (n-1-right)*abs(i-t[d]));
                if(b[d]>=0)
                    ans = max(ans , (n-1-right)*abs(b[d]-i));
                if(t[d]>=0)
                    ans = max(ans , (right)*abs(i-t[d]));
                if(b[d]>=0)
                    ans = max(ans , (right)*abs(b[d]-i));
            }
        }

        for(int j=0;j<n;++j){
            int top = -1;
            int bottom = -1;
            for(int i=0;i<n;++i){
                if(s[i][j]-'0' == d){
                    top = i; break;
                }
            }
            for(int i=n-1;i>=0;--i){
                if(s[i][j] - '0' == d){
                    bottom = i; break;
                }
            }
            if(top>=0&&bottom>=0){
                ans = max(ans , (bottom-top)*(n-1-j));
                ans = max(ans , (bottom-top)*j);
            }
            if(top>=0){
                if(l[d]>=0)
                    ans = max(ans , (n-1-top)*abs(j-l[d]));
                if(r[d]>=0)
                    ans = max(ans , (n-1-top)*abs(r[d]-j));
                if(l[d]>=0)
                    ans = max(ans , (top)*abs(j-l[d]));
                if(r[d]>=0)
                    ans = max(ans , (top)*abs(r[d]-j));
            }
            if(bottom>=0){
                if(l[d]>=0)
                    ans = max(ans , (n-1-bottom)*abs(j-l[d]));
                if(r[d]>=0)
                    ans = max(ans , (n-1-bottom)*abs(r[d]-j));
                if(l[d]>=0)
                    ans = max(ans , (bottom)*abs(j-l[d]));
                if(r[d]>=0)
                    ans = max(ans , (bottom)*abs(r[d]-j));
            }
        }
        cout<<ans<<' ';
    }
    cout<<'\n';
    
}

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        int t;
        cin>>t;
        while(t--)
            solve();
}   
