#include <bits/stdc++.h>
using namespace std;
const long long N = 1e3 + 1;
long long n, m;
vector<string> a;
long long dp[N][N];
long long grp[N][N];
bool val(long long x, long long y) {
  if (0 <= x && x < n && 0 <= y && y < m) return true;
  return false;
}
bool flag(long long x, long long y, long long sze) {
  if (!val(x, y)) return false;
  if (val(x, y) && val(x - sze, y) && val(x - 2 * sze, y) &&
      a[x - sze][y] != a[x - 2 * sze][y] && a[x][y] != a[x - sze][y] &&
      grp[x - sze][y] == sze && grp[x - 2 * sze][y] >= sze)
    return true;
  return false;
}
bool pre(long long x, long long y, long long sze) {
  if (!val(x, y)) return false;
  if (0 <= y - 1 && y - 1 < m) {
    if (val(x, y - 1) && a[x][y] == a[x][y - 1] && val(x - sze, y - 1) &&
        a[x - sze][y] == a[x - sze][y - 1] && val(x - 2 * sze, y - 1) &&
        a[x - 2 * sze][y] == a[x - 2 * sze][y - 1] && grp[x - sze][y] == sze &&
        grp[x - 2 * sze][y] >= sze && grp[x - sze][y - 1] == sze &&
        grp[x - 2 * sze][y - 1] >= sze && grp[x][y - 1] == sze)
      return true;
  }
  return false;
}
int main() {
  memset(dp, 0, sizeof(dp));
  memset(grp, 0, sizeof(grp));
  cin >> n >> m;
  a.resize(n);
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  long long ans = 0;
  for (long long i = 0; i < m; i++) {
    grp[0][i] = 1;
    for (long long j = 1; j < n; j++) {
      grp[j][i] = (a[j - 1][i] == a[j][i]) ? (grp[j - 1][i] + 1) : 1;
    }
  }
  for (long long i = 2; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      long long sze = grp[i][j];
      if (pre(i, j, sze)) {
        if (j != 0)
          dp[i][j] = dp[i][j - 1] + 1;
        else
          dp[i][j] = 1;
      } else if (flag(i, j, sze)) {
        dp[i][j] = 1;
      }
    }
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      ans += dp[i][j];
    }
  }
  cout << ans << endl;
  return 0;
}
