#include using namespace std; string tab[1005]; int prawo[1005][1005]; int lewo[1005][1005]; int mgl[1005][1005]; int mdl[1005][1005]; int mgp[1005][1005]; int mdp[1005][1005]; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for (int i=1; i<=n; i++) { cin >> tab[i]; tab[i] = "#" + tab[i]; } for (int i=1; i<=n; i++) { prawo[i][m]=1; for (int j=m-1; j>0; j--) { if (tab[i][j]==tab[i][j+1]) prawo[i][j]=prawo[i][j+1]+1; else prawo[i][j]=1; } lewo[i][1]=1; for (int j=2; j<=m; j++) { if (tab[i][j]==tab[i][j-1]) lewo[i][j]=lewo[i][j-1]+1; else lewo[i][j]=1; } } long long wyn=0; for (int i=n; i>0; i--) { for (int j=1; j<=m; j++) { if (i!=n && tab[i+1][j]==tab[i][j]) { mdp[i][j]=min(mdp[i+1][j]+1, prawo[i][j]); mdl[i][j]=min(mdl[i+1][j]+1, lewo[i][j]); } else { mdp[i][j]=1; mdl[i][j]=1; } } } for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { if (i!=1 && tab[i][j]==tab[i-1][j]) { mgp[i][j]=min(mgp[i-1][j]+1, prawo[i][j]); mgl[i][j]=min(mgl[i-1][j]+1, lewo[i][j]); } else { mgp[i][j]=1; mgl[i][j]=1; } wyn+=mdp[i][j]+mdl[i][j]+mgp[i][j]+mgl[i][j]-4; } } cout << wyn << "\n"; return 0; }