Problem:
Score : 800 points

Problem Statement

Mr. Takahashi has in his room an art object with H rows and W columns, made up of H \times W blocks.
Each block has a color represented by a lowercase English letter (a-z).
The color of the block at the i-th row and j-th column is c_{i,j}.

Mr. Takahashi would like to dismantle the object, finding it a bit kitschy for his tastes.
The dismantling is processed by repeating the following operation:

Choose one of the W columns and push down that column one row.
The block at the bottom of that column disappears.

Each time the operation is performed, a cost is incurred.
Since blocks of the same color have a property to draw each other together, the cost of the operation is the number of the pairs of blocks (p, q) such that:

The block p is in the selected column.

The two blocks p and q are horizontally adjacent (before pushing down the column).

The two blocks p and q have the same color.

Mr. Takahashi dismantles the object by repeating the operation H \times W times to get rid of all the blocks.
Compute the minimum total cost to dismantle the object.

Constraints

1 ≤ H ≤ 300

2 ≤ W ≤ 300

All characters c_{i,j} are lowercase English letters (a-z).

Partial Score

In test cases worth 300 points, W = 3.

Input

The input is given from Standard Input in the following format:

H W
c_{1,1}c_{1,2}..c_{1,W}
c_{2,1}c_{2,2}..c_{2,W}
:
c_{H,1}c_{H,2}..c_{H,W}

Output

Print the minimum total cost to dismantle the object.

Sample Input 1

2 3
rrr
brg

Sample Output 1

2

For example, the total cost of 2 can be achieved by performing the operation as follows and this is the minimum value.

Sample Input 2

6 3
xya
xya
ayz
ayz
xaz
xaz

Sample Output 2

0

The total cost of 0 can be achieved by first pushing down all blocks of the middle column, then all of the left column, and all of the right column.

Sample Input 3

4 2
ay
xa
xy
ay

Sample Output 3

0

The total cost of 0 can be achieved by the following operations:

pushing down the right column one row;

pushing down the left column one row;

pushing down all of the right column;

and pushing down all of the left column.

Sample Input 4

5 5
aaaaa
abbba
ababa
abbba
aaaaa

Sample Output 4

24

Sample Input 5

7 10
xxxxxxxxxx
ccccxxffff
cxxcxxfxxx
cxxxxxffff
cxxcxxfxxx
ccccxxfxxx
xxxxxxxxxx

Sample Output 5

130

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#include <limits.h>

#define lli long long int
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define	abs(a) ((a)<0?-(a):(a))



int main(void){
	/* === input paramater === */
	int h;
	int w;
	char **c;


	/* === paramter === */
	int i,j,k;
	int *count;
	int *fric;
	int maxmem;
	int delmem;
	int score;

	/* === input === */
	scanf("%d%d",&h,&w);
	c = calloc(sizeof(char*),h);
	for(i=0;i<h;i++){
		c[i]++;
		c[i] = calloc(sizeof(char),w+3);
		scanf("%s",c[i]);
	}


	/* === prepare === */
	count = calloc(sizeof(int),w+2);
	count++;
	for(i=0;i<w;i++){
		count[i] = h-1;
	}
	fric  = calloc(sizeof(int),w);
	score = 0;
	for(i=0;i<w;i++){
		for(j=0;j<h;j++){
			for(k=j;k<h;k++){
				if(c[j][i] == c[k][i-1]){
					score++;
				}
				if(c[j][i] == c[k][i+1]){
					score++;
				}
			}
		}
	}


	/* === core === */
	for(k=0;k<w*h;k++){
		for(i=0;i<w;i++){
			if(count[i] < 0){
				fric[i] = 0;
				continue;
			}
			fric[i] = 0;
			for(j=0;j<=count[i+1];j++){
				if(c[count[i]][i] == c[j][i+1]){
					fric[i]++;
				}
			}
			for(j=0;j<=count[i-1];j++){
				if(c[count[i]][i] == c[j][i-1]){
					fric[i]++;
				}			
			}

		}
		maxmem = 0;
		delmem = 0;
		for(i=0;i<w;i++){
			if(maxmem < fric[i]){
				maxmem = fric[i];
				delmem = i;
			}
		}
		count[delmem]--;
		score -= maxmem;
	}


	/* === output === */
	printf("%d\n", score);


	return 0;
}