#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

int H,W;

struct Info{
	Info(){
		row = col = 0;
		exist = false;
	}
	Info(int arg_row,int arg_col,bool arg_exist){
		row = arg_row;
		col = arg_col;
		exist = arg_exist;
	}

	void set(int arg_row,int arg_col,bool arg_exist){
		row = arg_row;
		col = arg_col;
		exist = arg_exist;
	}
	int row,col;
	bool exist;
};

int main(){

	scanf("%d %d",&H,&W);
	char map[H][W+1];

	Info info[26][2];
	for(int i = 0; i < 26; i++){
		for(int k = 0; k < 2; k++){
			info[i][k].exist = false;
		}
	}

	vector<Info> V_ROW[500],V_COL[500];
	int maximum = 0;

	for(int i = 0; i < H; i++){
		scanf("%s",map[i]);
		for(int k = 0; k < W; k++){
			switch(map[i][k]){
			case '.':
				V_ROW[i].push_back(Info(i,k,false));
				V_COL[k].push_back(Info(i,k,false));
				break;
			default:
				if(info[map[i][k]-'A'][0].exist == false){
					info[map[i][k]-'A'][0].exist = true;
					info[map[i][k]-'A'][0].set(i,k,true);
					maximum++;
				}else{
					info[map[i][k]-'A'][1].set(i,k,true);
				}
				break;
			}
		}
	}

	int ans = 0,common_row,common_col,small,big;
	bool FLG,erasableFLG;

	while(true){

		FLG = false;

		for(int i = 0; i < 26; i++){
			if(info[i][0].exist){
				if(info[i][0].row == info[i][1].row){

					common_row = info[i][0].row;
					if(info[i][0].col > info[i][1].col){
						small = info[i][1].col;
						big = info[i][0].col;
					}else{
						small = info[i][0].col;
						big = info[i][1].col;
					}

					for(int a = 0;a < V_ROW[common_row].size();a++){
						if(V_ROW[common_row][a].col > small && V_ROW[common_row][a].col < big){

							erasableFLG = false;

							for(int tmp_col = V_ROW[common_row][a].col; tmp_col >= 0 ;tmp_col--){
								if(map[common_row][tmp_col] != '.'){
									if(map[common_row][tmp_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;

							erasableFLG = false;

							for(int tmp_col = V_ROW[common_row][a].col; tmp_col <= W-1 ;tmp_col++){
								if(map[common_row][tmp_col] != '.'){
									if(map[common_row][tmp_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;

							map[common_row][info[i][0].col] = '.';
							map[common_row][info[i][1].col] = '.';
							V_ROW[common_row].push_back(Info(common_row,info[i][0].col,false));
							V_ROW[common_row].push_back(Info(common_row,info[i][1].col,false));
							V_COL[info[i][0].col].push_back(Info(common_row,info[i][0].col,false));
							V_COL[info[i][1].col].push_back(Info(common_row,info[i][1].col,false));
							info[i][0].exist = false;
							ans += 2;
							FLG = true;
						}
					}

				}else if(info[i][0].col == info[i][1].col){

					common_col = info[i][0].col;
					if(info[i][0].row > info[i][1].row){
						small = info[i][1].row;
						big = info[i][0].row;
					}else{
						small = info[i][0].row;
						big = info[i][1].row;
					}

					for(int a = 0;a < V_COL[common_col].size();a++){

						if(V_COL[common_col][a].row > small && V_COL[common_col][a].row < big){

							erasableFLG = false;

							for(int tmp_row = V_COL[common_col][a].row; tmp_row >= 0 ;tmp_row--){
								if(map[tmp_row][common_col] != '.'){
									if(map[tmp_row][common_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;

							erasableFLG = false;

							for(int tmp_row = V_COL[common_col][a].row; tmp_row <= H-1 ;tmp_row++){
								if(map[tmp_row][common_col] != '.'){
									if(map[tmp_row][common_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;

							map[info[i][0].row][common_col] = '.';
							map[info[i][1].row][common_col] = '.';
							V_ROW[info[i][0].row].push_back(Info(info[i][0].row,common_col,false));
							V_ROW[info[i][1].row].push_back(Info(info[i][1].row,common_col,false));
							V_COL[common_col].push_back(Info(info[i][0].row,common_col,false));
							V_COL[common_col].push_back(Info(info[i][1].row,common_col,false));
							info[i][0].exist = false;
							ans += 2;
							FLG = true;
						}
					}

				}else{

					if(map[info[i][0].row][info[i][1].col] == '.'){

						erasableFLG = false;

						if(info[i][0].col > info[i][1].col){

							for(int tmp_col = info[i][1].col+1; tmp_col <= W-1; tmp_col++){
								if(map[info[i][0].row][tmp_col] != '.'){
									if(map[info[i][0].row][tmp_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}

						}else{

							for(int tmp_col = info[i][1].col-1; tmp_col >= 0; tmp_col--){
								if(map[info[i][0].row][tmp_col] != '.'){
									if(map[info[i][0].row][tmp_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
						}

						if(erasableFLG){
							erasableFLG = false;

							if(info[i][0].row > info[i][1].row){

								for(int tmp_row = info[i][0].row-1; tmp_row >= 0; tmp_row--){
									if(map[tmp_row][info[i][1].col] != '.'){
										if(map[tmp_row][info[i][1].col] == 'A' + i){
											erasableFLG = true;
											break;
										}else{
											break;
										}
									}
								}

							}else{

								for(int tmp_row = info[i][0].row+1; tmp_row <= H-1; tmp_row++){
									if(map[tmp_row][info[i][1].col] != '.'){
										if(map[tmp_row][info[i][1].col] == 'A' + i){
											erasableFLG = true;
											break;
										}else{
											break;
										}
									}
								}
							}

							if(erasableFLG){

								map[info[i][0].row][info[i][0].col] = '.';
								map[info[i][1].row][info[i][1].col] = '.';
								V_ROW[info[i][0].row].push_back(Info(info[i][0].row,info[i][0].col,false));
								V_ROW[info[i][1].row].push_back(Info(info[i][1].row,info[i][1].col,false));
								V_COL[info[i][0].col].push_back(Info(info[i][0].row,info[i][0].col,false));
								V_COL[info[i][1].col].push_back(Info(info[i][1].row,info[i][1].col,false));
								info[i][0].exist = false;
								ans += 2;
								FLG = true;
							}
						}
					}

					if(map[info[i][1].row][info[i][0].col] == '.'){
						erasableFLG = false;

						if(info[i][1].col > info[i][0].col){

							for(int tmp_col = info[i][0].col+1; tmp_col <= W-1; tmp_col++){
								if(map[info[i][1].row][tmp_col] != '.'){
									if(map[info[i][1].row][tmp_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;

						}else{

							for(int tmp_col = info[i][0].col-1; tmp_col >= 0; tmp_col--){
								if(map[info[i][1].row][tmp_col] != '.'){
									if(map[info[i][1].row][tmp_col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;
						}

						erasableFLG = false;

						if(info[i][1].row > info[i][0].row){

							for(int tmp_row = info[i][1].row-1; tmp_row >= 0; tmp_row--){
								if(map[tmp_row][info[i][0].col] != '.'){
									if(map[tmp_row][info[i][0].col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;

						}else{

							for(int tmp_row = info[i][1].row+1; tmp_row <= H-1; tmp_row++){
								if(map[tmp_row][info[i][0].col] != '.'){
									if(map[tmp_row][info[i][0].col] == 'A' + i){
										erasableFLG = true;
										break;
									}else{
										break;
									}
								}
							}
							if(!erasableFLG)continue;
						}

						map[info[i][0].row][info[i][0].col] = '.';
						map[info[i][1].row][info[i][1].col] = '.';
						V_ROW[info[i][0].row].push_back(Info(info[i][0].row,info[i][0].col,false));
						V_ROW[info[i][1].row].push_back(Info(info[i][1].row,info[i][1].col,false));
						V_COL[info[i][0].col].push_back(Info(info[i][0].row,info[i][0].col,false));
						V_COL[info[i][1].col].push_back(Info(info[i][1].row,info[i][1].col,false));
						info[i][0].exist = false;
						ans += 2;
						FLG = true;
					}
				}
			}
		}

		if(!FLG){
			break;
		}
		if(ans >= 2*maximum){
			break;
		}

	}

	printf("%d\n",ans);

	return 0;
}

Measured memory_bytes: 8984