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>
#define REP(i,n) for(i=0;i<(n);i++)
#define FOR(i,a,b) for(i=(a);i<(b);i++)
#define MAX(a,b) (a>b)?a:b;
#define MIN(a,b) (a<b)?a:b;


int H,W;
char data[301][301];
int dp[301][301][301] = {0};

int ans = 100000000;

void foo(int a,int b,int c,int d){
    int i,j,k;
    if (a == H-1 && b == H-1 && c == H-1){
        ans = MIN(ans,d);
    }
    if (ans <= d){
        return ;
    }
    if (dp[a][b][c])return;
    dp[a][b][c] = 1;
    
    int lef = 0;
    int rig = 0;
    
    int x = MAX(a,b);
    int y = MAX(b,c);
    FOR(i,x,H){
        if (data[0][i] == data[1][i]){
            lef += 1;
        }
    }

    FOR(i,y,H){
        if (data[2][i] == data[1][i]){
            rig  += 1;
        }
    }


    if (a < H-1){
        foo(a+1,b,c,d+lef);
    }
    if (b < H-1){
        foo(a,b+1,c,d+lef+rig);
    }
    if (c < H-1){
        foo(a,b,c+1,d+rig);
    }
}

int main(void){
    scanf("%d %d",&H,&W);
    int i,j,k;
    REP(i,H){
        char line[301];
        scanf("%s",line);
        REP(j,W){
            data[j][i] = line[j];
        }
    }
    if (W == 3){
    foo(0,0,0,0);
    printf("%d\n",ans);
    }else{
        printf("0\n");
    }
    return 0;
}