#include #include #define PB push_back #define F first #define B back using namespace std; typedef long long int ll; typedef vector vl; typedef vector vvl; const ll asci_codes=100, W=1010, H=1010; ll up[asci_codes][H][W], down[asci_codes][H][W]; char input[H][W]; int main(int argc, char const *argv[]) { ll n, m; cin >> n >> m; for (ll i = 0; i < n; ++i) { for (ll j = 0; j < m; ++j) { cin >> input[i][j]; input[i][j] -= 33; } } for (ll j = 0; j < m; ++j) { for (ll code = 0; code < asci_codes; ++code) { if (code == input[0][j]) { up[code][0][j] = 1; } else { up[code][0][j] = 0; } for (ll i = 1; i < n; ++i) { if (code == input[i][j]) { up[code][i][j] = up[code][i-1][j]+1; } else { up[code][i][j] = 0; } } if (code == input[n-1][j]) { down[code][n-1][j] = 1; } else { down[code][n-1][j] = 0; } for (ll i = n-2; i >= 0; --i) { if (code == input[i][j]) { down[code][i][j] = down[code][i+1][j]+1; } else { down[code][i][j] = 0; } } } } /* for (ll i = 0; i < n; ++i) { for (ll j = 0; j < m; ++j) { cout << down['#'-33][i][j] << " "; } cout << "\n"; } */ ll lu = 0, ld = 0, ru = 0, rd = 0; for (ll code = 0; code < asci_codes; ++code) { for (ll i = 0; i < n; ++i) { ll h = 0; ll d = 0; for (ll j = 0; j < m; ++j) { if (h >= up[code][i][j]) { h = up[code][i][j]; } else { ++h; } if (h > 1) lu += h-1; if (d >= down[code][i][j]) { d = down[code][i][j]; } else { ++d; } if (d > 1) ld += d-1; } } for (ll i = 0; i < n; ++i) { ll h = 0; ll d = 0; for (ll j = m-1; j >= 0; --j) { if (h >= up[code][i][j]) { h = up[code][i][j]; } else { ++h; } if (h > 1) ru += h-1; if (d >= down[code][i][j]) { d = down[code][i][j]; } else { ++d; } if (d > 1) rd += d-1; } } } ll s = ld+lu+rd+ru; //cout << ld << " " << lu << " " << rd << " " << ru << "\n"; cout << s << endl; return 0; }