#include<bits/stdc++.h>
using namespace std;
const int mx=2100;
#define ll long long
int t,n;
struct node{
	int x;
	int y;
};
vector<node> ve[20];
char c[20000];

bool cmp1(node a,node b){
	return a.x<b.x;
}
bool cmp2(node a,node b){
	return a.y<b.y;
}

int col(int x,int y,int xx,int yy){
	ll ans=0;
	ll tem=abs(x-xx)*max(max(y-1,n-y),max(yy-1,n-yy));
	ans=tem;
	tem=abs(y-yy)*max(max(x-1,n-x),max(xx-1,n-xx));
	return max(ans,tem);
}

int main(){
	
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=0;i<10;i++) ve[i].clear();
		for(int i=1,x;i<=n;i++){
			scanf("%s",c);
			for(int j=1;j<=n;j++){
				ve[c[j-1]-'0'].push_back({i,j});
			}
		}
//		cout<<"dss\n";
		for(int i=0;i<=9;i++){
			ll ans=0;
			int si=ve[i].size();
			if(si<2){
				printf("0 ");
				continue;
			}
//			cout<<"sss\n";
			sort(ve[i].begin(),ve[i].end(),cmp1);
			int x=ve[i][0].x, y=ve[i][0].y;
			int xx=ve[i][si-1].x, yy=ve[i][si-1].y;
			ll tem=0;
			for(int k=0;k<si;k++){
				int a=ve[i][k].x,b=ve[i][k].y;
				tem=col(a,b,x,y);
				ans=max(ans,tem);
				tem=col(a,b,xx,yy);
				ans=max(ans,tem);
			}
			sort(ve[i].begin(),ve[i].end(),cmp2);
			x=ve[i][0].x, y=ve[i][0].y;
			xx=ve[i][si-1].x, yy=ve[i][si-1].y;
			for(int k=0;k<si;k++){
				int a=ve[i][k].x,b=ve[i][k].y;
				tem=col(a,b,x,y);
				ans=max(ans,tem);
				tem=col(a,b,xx,yy);
				ans=max(ans,tem);
			}
//			ll tem=abs(x-xx)*max(max(y-1,n-y),max(yy-1,n-yy));
//			ans=tem;
//			tem=abs(y-yy)*max(max(x-1,n-x),max(xx-1,n-xx));
//			ans=max(ans,tem);
			printf("%lld ",ans);
		}
		puts("");
	}

	return 0;
}
