#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;

string mps[501];
pair<int,int> tile1[26];
pair<int,int> tile2[26];
int m,n;

bool inter(int i,int j,int k) {
    if(j == k && i != j) return false;
    if(j > k) swap(j,k);

    return (j <= i) && (i <= k);
}

int iabs(int i) {
    if(i < 0) return -i;
    return i;
}

bool is_o(pair<int,int> tile,int x1,int y1,int x2,int y2) {
    bool is1 = false,is2 = false;
    if(tile.first == y1 && inter(tile.second,x1,x2)) is1 = true;
    if(tile.second == x2 && inter(tile.first,y1,y2)) is1 = true;

    return is1;
}

bool is_s(pair<int,int> tile,int x1,int y1,int x2,int y2) {
    bool is2 = false;

    if(tile.first == y2 && inter(tile.second,x1,x2)) is2 = true;
    if(tile.second == x1 && inter(tile.first,y1,y2)) is2 = true;
    return is2;
}

bool ok(int idx,int x1,int y1,int x2,int y2) {
    // adj
    if(x1 == x2 && iabs(y1-y2) == 1) return false;
    if(y1 == y2 && iabs(x1-x2) == 1) return false;

    for(int i=0; i<26; ++i) {
        if(tile1[i].first == -1 || i == idx) continue;
        if(x1 == x2) {
            if(tile1[i].second == x1 && inter(tile1[i].first,y1,y2)) return false;
            if(tile2[i].second == x1 && inter(tile2[i].first,y1,y2)) return false;
        }else if(y1 == y2) {
            if(tile1[i].first == y1 && inter(tile1[i].second,x1,x2)) return false;
            if(tile2[i].first == y1 && inter(tile2[i].second,x1,x2)) return false;
        }
    }

    if(y1 > y2) {
        swap(y1,y2);
        swap(x1,x2);
    }

    bool is1 = false,is2 = false;
    for(int i=0; i<26; ++i) {
        if(tile1[i].first == -1 || i == idx) continue;
        if(is_o(tile1[i],x1,y1,x2,y2)) is1 = true;
        if(is_s(tile1[i],x1,y1,x2,y2)) is2 = true;
        if(is_o(tile2[i],x1,y1,x2,y2)) is1 = true;
        if(is_s(tile2[i],x1,y1,x2,y2)) is2 = true;
    }

    if(is1 && is2) return false;

    return true;
}

int main() {
    cin>>m>>n;
    for(int i=0; i<m; ++i) cin>>mps[i];

    for(int i=0; i<26; ++i)
        tile1[i] = tile2[i] = make_pair(-1,-1);

    for(int i=0; i<m; ++i) {
        for(int j=0; j<n; ++j) {
            if(mps[i][j] != '.') {
                if(tile1[mps[i][j]-'A'].first == -1) tile1[mps[i][j]-'A'] = make_pair(i,j);
                else tile2[mps[i][j]-'A'] = make_pair(i,j);
            }
        }
    }

    int ans = 0;
    while(true) {
        bool update = false;

        for(int i=0; i<26; ++i) {
            if(tile1[i].first == -1) continue;
            int x1 = tile1[i].second,y1 = tile1[i].first;
            int x2 = tile2[i].second,y2 = tile2[i].first;
            if(ok(i,x1,y1,x2,y2)) {
                tile1[i] = make_pair(-1,-1);
                tile2[i] = make_pair(-1,-1);
                ans += 2;
                update = true;
            }

        // for(int i=0; i<m; ++i) {
        //     for(int j=0; j<n; ++j) {
        //         if(mps[i][j] == '.') cout<<".";
        //         else if(tile1[mps[i][j]-'A'].first == -1) cout<<".";
        //         else cout<<mps[i][j];
        //     }
        //     cout<<endl;
        // }
        }

        if(!update) break;


    }

    cout<<ans<<endl;
}

Measured memory_bytes: 0