#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=1010;
int n;
char a[N][N];
//da[i][j]是a[i][j]作为左下角时的最大对称矩阵
int dp[N][N];
int main(){
while(cin>>n&&n)
{
int ans=1;
memset(dp,0,sizeof dp);
for(int i=0;i<n;i++)
cin>>a[i];
//枚举对角线端点
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
{
//第一行和最后一列初始为1,因为无法继续延伸
if(i==0||j==n-1)
{
dp[i][j]=1;
continue;
}
//对角线的
int t1=i,t2=j;
//从(i,j)分别向上向右延伸,直到不相等为止
while(t1>=0&&t2<=n-1&&a[t1][j]==a[i][t2])
{
t1--;
t2++;
}
int k=i-t1;
// da[i][j]是 a[i][j] 作为 左下角 时的最大对称矩阵
//画图便于理解
//while里面扩展的是最外层
//取min是要顾及里层的
dp[i][j]=min(dp[i-1][j+1]+1,k);
ans=max(ans,dp[i][j]);
}
}
cout<<ans<<endl;
}
return 0;
}