//最大子矩阵问题,跟1505,1506是一个思路的题目
//先记录每一列连续最大相同的字母的个数cnt[i][j]
//表示前i行第j列连续相同字母的个数
//然后再每一行进行相同的计算
//
//l[j]记录第j列的左边比它多的元素的个数的位置
//r[j]记录第j列的右边比它多的元素的个数的位置
//r[j]-l[j] + 1就是第j列的位置上有连续个cnt[i][j]的元素的值
//(r[j]-l[j] + 1)* cnt[i][j]就是求的子矩阵,取最大值即可
//这题也做了好久,是看着题解说1505,1506类似,
//就按照之前的做法敲了一遍,结果wa了无数发,
//最后的最后还是看了看大神的题解才恍然大悟,
//原来只要按a,b,c各自进行一遍求值,取个最大即可
//最后注意:每次l[j]和r[j]都必须初始化成j,因为本身的左边和右边就是本身
//注释部分是开始敲得错误的思路,也没什么好删去的,留着给自己一个警醒吧
//哎,,,不想吐槽自己,太水了。。。继续练吧
//
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#define ceil(a,b) (((a)+(b)-1)/(b))
#define endl '\n'
#define gcd __gcd
#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
#define popCount __builtin_popcountll
typedef long long ll;
using namespace std;
const int MOD = 1000000007;
const long double PI = acos(-1.L);
template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }
template<class T> inline T lowBit(const T& x) { return x&-x; }
template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }
template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }
const int maxn = 1082;
char mp[maxn][maxn];
int cnt[maxn][maxn];
int l[maxn];
int r[maxn];
int ans;
int n,m;
void init(){
for (int i=1;i<=n;i++)
scanf("%s",mp[i]+1);
ans=0;
}
void get(char now,char a,char b,char c){
memset(cnt,0,sizeof(cnt));
// memset(l,0,sizeof(l));
// memset(r,0,sizeof(r));
// for (int i=1;i<=n;i++){
// for (int j=1;j<=m;j++){
// if (mp[i][j]==a||mp[i][j]==b||mp[i][j]==c)
// }
// }
for (int i=1;i<=n;i++){
// cnt[i][0] = cnt[i][m+1]=-1;
for (int j=1;j<=m;j++){
l[j]=r[j]=j;
if (mp[i][j]==a||mp[i][j]==b||mp[i][j]==c||mp[i][j]==now)
cnt[i][j] = cnt[i-1][j]+1;
else cnt[i][j] = 0;
}
//puts("1");
// l[0]=1,r[m+1]=1;
for (int j=2;j<=m;j++){
// l[j]=r[j]=1;
if (!cnt[i][j]) continue;
while(cnt[i][l[j]-1]>=cnt[i][j])
l[j] = l[l[j]-1];
}
// puts("2");
for (int j=m-1;j>=1;j--){
if (!cnt[i][j]) continue;
while(cnt[i][r[j]+1]>=cnt[i][j])
r[j] = r[r[j]+1];
}
// puts("3");
for (int j=1;j<=m;j++){
if (!cnt[i][j]) continue;
int temp = cnt[i][j]*(r[j]-l[j]+1);
ans = max (ans,temp);
}
// puts("4");
}
}
void solve(){
get('a','w','y','z');
get('b','w','x','z');
get('c','x','y','z');
printf("%d\n",ans);
}
int main() {
//freopen("G:\\Code\\1.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF){
init();
solve();
}
return 0;
}