基础DP
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
typedef long long LL;
const int M = 10000;
const int INF = 0x3f3f3f3f;
string s[1050];
int dp[1050][1050];
//char s[1050][1050];
int main()
{
int n;
while (cin >> n&&n != 0)
{
getchar();
for (int i = 0; i < n; ++i)
{
//gets(s[i]);
getline(cin, s[i]);
}
memset(dp, 0, sizeof(dp));
int ans = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (i == 0)
{
dp[i][j] = 1;
//continue;
}
else
{
int a = i;
int b = j;
while (s[a][j]==s[i][b] )
{
a--;
b++;
if (a < 0 || b >= n)
break;
}
a = i - a;
if (a > dp[i - 1][j + 1])
{
dp[i][j] = dp[i - 1][j + 1] + 1;
}
else
{
dp[i][j] = a;
}
}
ans = max(dp[i][j], ans);
}
}
printf("%d\n", ans);
}
return 0;
}