string s;
while ((s = System.Console.ReadLine()) != null)
{
var arr = s.Split(",");
int m = int.Parse(arr[0]);
int n = int.Parse(arr[1]);
string[,] map = new string[m, n];
for (int i = 0; i < m; i++)
{
var input = Console.ReadLine();
var arr1 = input.Split(",");
for (int j = 0; j < n; j++)
{
map[i, j] = arr1[j];
}
}
System.Console.WriteLine(findMax(map, m, n));
}
int findMax(string[,] map,int m, int n)
{
int max = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
string tmp = map[i, j];
if (tmp == "M")
{
int tmpMax = 1;
if (max < n)
{
//横向向前搜索
for (int k = j + 1; k < n; k++)
{
if (map[i, k] != "M")
{
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
break;
}
else tmpMax++;
}
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
}
if (max < m)
{
//纵向向下搜索
for (int k = i + 1; k < m; k++)
{
if (map[k, j] != "M")
{
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
break;
}
else tmpMax++;
}
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
}
if (max < Math.Min(n, m))
{
//向下对角线搜索
for (int k = 1; k + i < m && k + j < n; k++)
{
if (map[i + k, j + k] != "M")
{
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
break;
}
else tmpMax++;
}
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
//向下反对角线搜索
for (int k = 1; i + k < m && j - k >= 0; k++)
{
if (map[i + k, j - k] != "M")
{
max = max > tmpMax ? max : tmpMax;
tmpMax = 1;
break;
}
else tmpMax++;
}
max = max > tmpMax ? max : tmpMax;
}
}
if (max == Math.Max(m, n)) break;
}
}
return max;
}