#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int solve(void);
bool canClear(const char target, vector<string>&mp, vector<vector<vector<int>>> &pos);

int main(void) {

//	FILE *fpin = freopen("data.txt", "r", stdin);
	cout << solve() << endl;
	return 0;

}

int solve(void) {

	int N, M;
	cin >> M >> N;

	vector<string> mp(M);
	vector< int > isUsed(26, 0);
	vector< vector< vector< int > > > pos(2, vector< vector< int > >(2, vector< int >(26, 0)));


	for (int i = 0; i < M; i++) {
		cin >> mp[i];
		for (int j = 0; j < N; j++) {
			const char ch = mp[i][j];
			if (ch != '.') {
				int index = ch - 'A';
				pos[isUsed[index]][0][index] = i;
				pos[isUsed[index]][1][index] = j;
				isUsed[index] ++;
				if (isUsed[index] == 2) {
					isUsed[index] = 0;
					if (pos[0][0][index] == pos[1][0][index] && abs(pos[0][1][index] - pos[1][1][index]) == 1) {
						isUsed[index] = 0;
					}
					else if (pos[0][1][index] == pos[1][1][index] && abs(pos[0][0][index] - pos[1][0][index]) == 1) {
						isUsed[index] = 0;
					}
					else {
						isUsed[index] = 2;
					}
					if (pos[0][1][index] > pos[1][1][index]) {
						swap(pos[0][0][index], pos[1][0][index]);
						swap(pos[0][1][index], pos[1][1][index]);
					}
				}
			}
		}
	}
	
	int ans = 0;
	bool b = true;
	while (b == true) {
		b = false;
		for (int i = 0; i < 26; i++) {
			if (isUsed[i] < 2) { continue; }
			char ch = 'A' + i;
			b = canClear(ch, mp, pos);
			if (b) {
				isUsed[i] = 0;
				mp[pos[0][0][i]][pos[0][1][i]] = '.';
				mp[pos[1][0][i]][pos[1][1][i]] = '.';
				ans += 2;
				break;
			}
		}

	}

	
	return ans;
}

bool canClear(const char target, vector<string>& mp, vector<vector<vector<int>>>& pos)
{
	
	int ind = target - 'A';

	int d[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };
	/*
	dir[????????????????????????][1??????????????????2??????????????????] = ???????????????????????????
	0->???
	1->???
	2->???
	3->???
	*/
	int dir[2][2] = { {-1,-1},{-1,-1} };
	int start[2][2];

	for (int i = 0; i < 2; i++) {
		start[i][0] = pos[1-i][0][ind];
		start[i][1] = pos[i][1][ind];
	}

	if (start[0][1] == start[1][1]) {
		//x??§?¨??????????
		start[0][0] = (start[0][0] + start[1][0]) / 2;
		dir[0][0] = 1;
		dir[0][1] = 3;
	}
	else if (start[0][0] == start[1][0]) {
		//y??§?¨??????????
		start[0][1] = (start[0][1] + start[1][1]) / 2;
		dir[0][0] = 0;
		dir[0][1] = 2;
	}
	else if (start[0][0] < start[1][0]) {
		//????????????
		dir[0][0] = 0;
		dir[0][1] = 1;
		dir[1][0] = 2;
		dir[1][1] = 3;
	}
	else {
		//????????????
		dir[0][0] = 0;
		dir[0][1] = 3;
		dir[1][0] = 1;
		dir[1][1] = 2;
	}

	for (int i = 0; i < 2; i++) {
		//????????????????????????
		int cnt = 0;
		for (int j = 0; j < 2; j++) {
			//???????????????????????????
			if (dir[i][j] < 0) { continue; }
			for (int t = 0;; t++) {
				int x, y;
				y = start[i][0] + d[dir[i][j]][0] * t;
				x = start[i][1] + d[dir[i][j]][1] * t;
				if (y >= 0 && y < mp.size() && x >= 0 && x < mp[y].length()) {
					if (mp[y][x] == target) {
						cnt++;
					}
					else if (mp[y][x] != '.') {
						break;
					}
				}
				else {
					break;
				}
			}
		}
		if (cnt == 2) {
			return true;
		}
	}


	return false;
}

Measured memory_bytes: 3316