#include #include #include #include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) ll work(vector &A) { int R = A.size(), C = A[0].size(); // rep(r, 0, R) // cout << A[r] << endl; vector> p(R); rep(i, 0, R) p[i].resize(C); rep(r, 0, R) rep(c, 0, C) p[r][c] = (c && A[r][c] == A[r][c - 1]) ? p[r][c -1] : c; vector> d(R); rep(i, 0, R) d[i].resize(C, 1LL); rep(r, 0, R) rep(c, 0, C) if (r && c && A[r][c] == A[r - 1][c - 1]) { // cout << "a" << r << " " << c << "\n"; d[r][c] = min(c - p[r][c] + 1, d[r - 1][c - 1] + 1); } // rep(r, 0, R) { // rep(c, 0, C) // cout << d[r][c] << " "; // cout << endl; // } // // cout << endl; // rep(r, 0, R) { // rep(c, 0, C) // cout << p[r][c] << " "; // cout << endl; // } ll s = 0; rep(r, 0, R) rep(c, 0, C) s += d[r][c] - 1; // cout << s << endl; return s; } int main(void) { ios_base::sync_with_stdio(false); int R, C; cin >> R >> C; vector A(R); getline(cin, A[0]); rep(r, 0, R) { getline(cin, A[r]); } ll sum = 0; sum += work(A); rep(r, 0, R) reverse(A[r].begin(), A[r].end()); sum += work(A); reverse(A.begin(), A.end()); sum += work(A); rep(r, 0, R) reverse(A[r].begin(), A[r].end()); sum += work(A); cout << sum << endl; }