#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int n, m;
vector<string> v;
vector<int> gi, gj;
vector<vector<char> > x;

inline bool eq4(char a, char b, char c, char d) {
    return a == b && b == c && c == d;
}

void calc_gij() {
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            int ni = (i+1)%n, nj = (j+1)%m;
            if(eq4(v[i][j], v[ni][j], v[i][nj], v[ni][nj])) {
                x[i][j] = 1, gi[i]++, gj[j]++;
            }
        }
    }
}

inline int gi_for(int i, int j) {
    return gi[i] - x[i][(j+m-1)%m];
}

inline int gj_for(int i, int j) {
    return gj[j] - x[(i+n-1)%n][j];
}

struct DS {
    int si, sj, g;
    DS() : si(0), sj(0), g(0) {
        for(int i = 0; i < n-1; ++i) {
            g += gi_for(i, 0);
        }
    }
    void r() {
        assert(sj < m-1);
        g -= gj_for(si, sj);
        g += gj_for(si, (sj+m-1)%m);
        ++sj;
    }
    void d() {
        assert(si < n-1);
        g -= gi_for(si, sj);
        g += gi_for((si+n-1)%n, sj);
        ++si;
    }
    void u() {
        assert(si > 0);
        g -= gi_for((si+n-2)%n, sj);
        g += gi_for(si-1, sj);
        --si;
    }
};

int main() {
    #define FNAME "video"
    #ifndef LOCAL
    freopen(FNAME ".in", "r", stdin);
    freopen(FNAME ".out", "w", stdout);
    #endif // LOCAL
    cin >> n >> m;
    v.resize(n);
    gi.resize(n);
    gj.resize(m);
    x.assign(n, vector<char>(m));
    for(int i = 0; i < n; ++i) {
        cin >> v[i];
    }
    calc_gij();
    DS ds;
    int ans = 0;
    for(int j = 0; j < m-1; ++j) {
        for(int i = 0; i < n-1; ++i) {
            ans = max(ans, ds.g);
            if(i < n-2) {
                ds.d();
            }
        }
        for(int i = 0; i < n-2; ++i) {
            ds.u();
        }
        ds.r();
    }
    cout << ans;
    return 0;
}
