#include #define ALL(x) (x).begin(), (x).end() #define SZ(x) (int) (x).size() #define pb push_back #define fi first #define se second using namespace std; typedef long long LL; typedef vector VI; typedef pair PII; typedef long double LD; const int maxn = 1e3 + 7; int dp[maxn][maxn], prawo[maxn][maxn], dol[maxn][maxn], tab[maxn][maxn]; LL res = 0; int n, m; void rob() { for(int i = n - 1;i >= 0;i--) for(int j = m - 1;j >= 0;j--) { if(tab[i + 1][j] == tab[i][j]) dol[i][j] = dol[i + 1][j] + 1; else dol[i][j] = 1; if(tab[i][j + 1] == tab[i][j]) prawo[i][j] = prawo[i][j + 1] + 1; else prawo[i][j] = 1; dp[i][j] = 0; if(tab[i + 1][j + 1] == tab[i][j]) dp[i][j] = dp[i + 1][j + 1] + 2; else dp[i][j] = 1; dp[i][j] = min(dp[i][j], min(prawo[i][j] - 1, dol[i][j] - 1)); res += (LL)dp[i][j]; //cerr<>n>>m; for(int i = 0;i< n;i++) for(int j = 0;j < m;j++) { char a; cin>>a; tab[i][j] = (int)a; } rob(); for(int i = 0;i < n / 2;i++) for(int j = 0; j< m;j++) swap(tab[i][j], tab[n - 1 - i][j]); rob(); for(int j = 0;j < m / 2;j++) for(int i = 0;i < n;i++) swap(tab[i][j], tab[i][m - 1 - j]); rob(); for(int i = 0;i < n / 2;i++) for(int j = 0; j< m;j++) swap(tab[i][j], tab[n - 1 - i][j]); rob(); cout<