#include using namespace std; #define PB push_back #define ZERO (1e-10) #define INF int(1e9+1) #define CL(A,I) (memset(A,I,sizeof(A))) #define DEB printf("DEB!\n"); #define D(X) cout<<" "<<#X": "<B&&A-ZERO pll; typedef vector vi; typedef pair ii; typedef vector vii; #define IN(n) int n;scanf("%d",&n); #define FOR(i, m, n) for (int i(m); i < n; i++) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define FT(m, n) FOR(k, m, n) #define aa first #define bb second void ga(int N,int *A){F(N)scanf("%d",A+i);} #define MX (5005) char s[MX][MX]; int N,M,D[MX][MX]; ll S; void mrx(){F(N)FF(M/2)swap(s[i][j],s[i][M-j-1]);} void mry(){F(N/2)FF(M)swap(s[i][j],s[N-i-1][j]);} ll go(){ ll S=0; F(N)FF(M)S+=D[i][j]=!i||!j||s[i][j]^s[i-1][j]||s[i][j]^s[i][j-1]?1:1+min(D[i][j-1],D[i-1][j]); return S; } int main(void){ scanf("%d%d",&N,&M); F(N)scanf("%s",s[i]); S+=go(); mrx(),S+=go(),mrx(); mry(),S+=go(),mry(); mry(),mrx(),S+=go(),mrx(),mry(); printf("%lld\n",S-N*M*4); return 0; }