#include <bits/stdc++.h>
using namespace std;
using vec_i = vector<int>;
using pii = pair<int, int>;
using ll = long long;
using vec_ii = vector<pii>;
using vec_ll = vector<ll>;
template <typename T>
using vec = vector<T>;
ll gcd(ll x, ll y) {
  ll m;
  while (y > 0) {
    m = x % y;
    x = y;
    y = m;
  }
  return x;
}
ll powm(ll x, ll n, ll m) {
  ll r = 1;
  while (n > 0) {
    if (n & 1) r = r * x % m;
    x = x * x % m;
    n /= 2;
  }
  return r;
}
static const int MOD = 1000000000 + 7;
static const int P = 343434;
const int PA = 257, PB = 983, MODA = 1e9 + 7, MODB = 1e9 + 9;
int n, m;
char ss[256][256];
int tt[256][256];
bool pal[256];
int hash_a[256], hash_b[256];
ll hash_lalaku[256];
int pa_pows[256], pb_pows[256];
inline bool is_pow2(int val) { return val != 0 && (val & (val - 1)) == 0; }
inline bool is_pal(int val, bool odd) {
  return (odd && is_pow2(val)) || ((!odd) && (val == 0));
}
int solve() {
  pa_pows[0] = 1;
  pb_pows[0] = 1;
  for (int i = 1; i < 256; ++i) {
    pa_pows[i] = pa_pows[i - 1] * 1ll * PA % MODA;
    pb_pows[i] = pb_pows[i - 1] * 1ll * PB % MODB;
  }
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", ss[i] + 1);
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      int val, c;
      c = ss[i][j] - 'a' + 1;
      val = (1 << c);
      tt[i][j] = tt[i][j - 1] ^ val;
    }
  }
  ll ans = 0;
  for (int i = 1; i <= m; ++i) {
    memset(hash_a, 0, sizeof(hash_a));
    memset(hash_b, 0, sizeof(hash_b));
    for (int j = i; j <= m; ++j) {
      bool all_same = true;
      for (int k = 1; k <= n; ++k) {
        pal[k] = is_pal(tt[k][j] ^ tt[k][i - 1], (j - i + 1) & 1);
        hash_a[k] += pa_pows[ss[k][j] - 'a' + 1];
        hash_b[k] += pb_pows[ss[k][j] - 'a' + 1];
        if (hash_a[k] >= MODA) hash_a[k] -= MODA;
        if (hash_b[k] >= MODB) hash_b[k] -= MODB;
        hash_lalaku[k] = ((ll)hash_a[k] << 32) | (hash_b[k]);
        all_same = (all_same) && pal[k] &&
                   (k == 1 || hash_lalaku[k] == hash_lalaku[k - 1]);
      }
      if (all_same) {
        ans += (n * (n + 1)) / 2;
        continue;
      }
      for (int k = 1; k <= n; ++k) {
        if (pal[k]) {
          int l = k, r = k;
          while (l > 1 && r < n && pal[l - 1] && pal[r + 1] &&
                 hash_lalaku[l - 1] == hash_lalaku[r + 1]) {
            --l;
            ++r;
          }
          ans += (r - l + 1 + 1) / 2;
        }
        if (k < n && pal[k + 1] && hash_lalaku[k] == hash_lalaku[k + 1]) {
          int l = k, r = k + 1;
          while (l > 1 && r < n && pal[l - 1] && pal[r + 1] &&
                 hash_lalaku[l - 1] == hash_lalaku[r + 1]) {
            --l;
            ++r;
          }
          ans += (r - l + 1) / 2;
        }
      }
    }
  }
  printf("%lld\n", ans);
  return 0;
}
int main(int argc, char* argv[]) {
  ::std::ios::sync_with_stdio(false);
  ::std::cin.tie(0);
  ::std::cout.tie(0);
  int test_count = 1;
  while (test_count--) {
    solve();
  }
  return 0;
}
