// Enjoy your stay.

#include <bits/stdc++.h>

#define EPS 1e-9
#define INF 1070000000LL
#define MOD 1000000007LL
#define fir first
#define foreach(it,X) for(auto it=(X).begin();it!=(X).end();it++)
#define ite iterator
#define mp make_pair
#define mt make_tuple
#define rep(i,n) rep2(i,0,n)
#define rep2(i,m,n) for(int i=m;i<(n);i++)
#define pb push_back
#define sec second
#define sz(x) ((int)(x).size())

using namespace std;

typedef istringstream iss;
typedef long long ll;
typedef pair<ll,ll> pi;
typedef stringstream sst;
typedef vector<ll> vi;

int M,N;
char c[555][555];
int y[33][2],x[33][2],num[33];
int del[33];

int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	
	cin>>M>>N;
	rep(i,M)cin>>c[i];
	vi ys,xs;
	memset(y,-1,sizeof(y));
	rep(i,M)rep(j,N){
		if(isupper(c[i][j])){
			int col = c[i][j] - 'A';
			y[col][num[col]] = i;
			x[col][num[col]] = j;
			num[col]++;
			rep2(d,-1,2){
				ys.pb(i+d);
				xs.pb(j+d);
			}
		}
	}
	int ans = 0;
	while(1){
		int flag = 0;
		rep(yi,sz(ys))rep(xi,sz(xs)){
			int Y = ys[yi], X = xs[xi];
			if(Y<0 || M<=Y || X<0 || N<=X)continue;
			int ok = 1;
			rep(i,26)if(!del[i] && (Y == y[i][0] && X == x[i][0]
				|| Y == y[i][1] && X == x[i][1]))ok=0;
			if(!ok)continue;

			int left = -INF, right = INF, up = -INF, down = INF;
			int l=-1,r=-2,u=-3,d=-4;
			rep(i,26)if(y[i][0] != -1 && !del[i])rep(j,2){
				if(y[i][j] == Y){
					if(x[i][j] < X && x[i][j] > left){
						left = x[i][j];
						l = i;
					}
					if(x[i][j] > X && x[i][j] < right){
						right = x[i][j];
						r = i;
					}
				}
				if(x[i][j] == X){
					if(y[i][j] < Y && y[i][j] > up){
						up = y[i][j];
						u = i;
					}
					if(y[i][j] > Y && y[i][j] < down){
						down = y[i][j];
						d = i;
					}
				}
			}
			int focus[4] = {l,r,u,d};
			rep(i,4)rep2(j,i+1,4)if(focus[i] == focus[j]){
				ans += 2;
				del[focus[i]] = 1;
				flag = 1;
				//cout<<(char)(focus[i]+'A')<<endl;
			}
		}
		if(!flag)break;
	}
	cout<<ans<<endl;
}