#include #define FOR(n, a, b) for(int n = (a); n < (b); ++n) #define ALL(x) x.begin(), x.end() #define pb push_back #define st first #define nd second using namespace std; const int maxN = 1010; int n, m; char T[maxN][maxN]; int pref[maxN][maxN]; bool onbord(int i, int j) { return i >= 0 and i < n and j >= 0 and j < m; } pair Start(int diag) { if (diag < n) return {diag, 0}; return {n-1, diag-n + 1}; } void swapp(int i0, int i1) { FOR(j, 0, m) swap(T[i0][j], T[i1][j]); } void swapp2(int j0, int j1) { FOR(i, 0, n) swap(T[i][j0], T[i][j1]); } int main() { scanf ("%d%d", &n, &m); FOR(i, 0, n) scanf ("%s", T[i]); long long res = 0; FOR(step, 0, 2) { FOR(step2, 0, 2) { FOR(i, 0, n) FOR(j, 1, m) pref[i][j] = T[i][j] == T[i][j - 1] ? pref[i][j- 1] : j; FOR(diag, 0, n+m-1) { int len = 0, i, j; for (tie(i, j) = Start(diag); onbord(i, j); i--, j++) { //printf("diag=%d, i=%d, j=%d; ", diag, i, j); while (onbord(i - (len+1), j + (len+1)) and T[i][j] == T[i - (len+1)][j + (len+1)] and pref[i - (len+1)][j + (len+1)] <= j) len++; //printf("len = %d;\n", len); res += len; len--; } } FOR(j, 0, m/2) swapp2(j, m-1-j); } FOR(i, 0, n/2) swapp(i, n-1-i); } printf("%lld\n", res); return 0; }