#include using namespace std; #define TRACE(x) cerr << #x << ' ' << x << endl #define FOR(i, a, b) for (int i = (a); i < int(b); i++) #define REP(i, n) FOR(i, 0, n) #define _ << ' ' << typedef long long llint; typedef long long ll; typedef pair pii; #define fi first #define sec second #define pb push_back const int Max = 1010; int len[Max][Max], same[Max][Max]; string t[Max], tmp[Max]; int n, m; ll sol; void init() { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int &s = same[i][j]; if (j == 0) s = 1; else s = same[i][j - 1] - 1; while (j + s < m && t[i][j + s] == t[i][j]) s++; } } } void solve() { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int &l = len[i][j]; if (i == 0) l = 0; else l = max(0, len[i - 1][j] - 1); while (l + i + 1 < n && l + j + 1 < m && t[i + 1 + l][j] == t[i][j] && same[i + 1 + l][j] >= l + 2) l++; sol += l; } } } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { cin >> tmp[i]; t[i] = tmp[i]; } for (int smece = 0; smece < 4; smece++) { for (int i = 0; i < m; i++) t[i] = ""; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) t[i] += tmp[j][m - 1 - i]; for (int i = 0; i < m; i++) tmp[i] = t[i]; swap(n, m); init(); solve(); } cout << sol; return 0; }