https://ac.nowcoder.com/acm/problem/51316

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;

#define IOS ios_base :: sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define fi first
#define se second
#define pb push_back

typedef long long ll;
typedef pair<int,int> PII;

const int N = 209;
char s[N][N];
vector<PII> house,people;
int p,h;
int a[N][N];

int lx[110], ly[110], match[110];
bool vx[110], vy[110];

int find(int x)
{
    vx[x] = 1;
    for (int i = 1; i <= h; i++)
    {
        if (!vy[i] && lx[x] + ly[i] == a[x][i])
        {
            vy[i] = 1;
            if (match[i] == -1 || find(match[i]))
            {
                match[i] = x;
                return 1;
            }
        }
    }
    return 0;
}

bool deal()
{
    memset(ly,0,sizeof ly);
    memset(lx,-0x3f,sizeof lx);
    memset(match,-1,sizeof match);
    for(int i=1; i<=p; i++)
    {
        for(int j=1; j<=h; j++)
            lx[i] = max(lx[i],a[i][j]);
    }
    for(int i=1; i<=p; i++)
    {
        while(true)
        {
            memset(vx,0,sizeof vx);
            memset(vy,0,sizeof vy);
            if(find(i)) break;
            int delta = 0x3f3f3f3f;
            for(int j=1; j<=p; j++)
            {
                if(vx[j] == 1)
                {
                    for(int k=1; k<=h; k++)
                    {
                        if(vy[k] == 0) delta = min(delta,lx[j] + ly[k] - a[j][k]);
                    }
                }
            }
            if(delta == 0x3f3f3f3f) return 0;
            for(int j = 1; j <= p; j++)
                if (vx[j] == 1) lx[j] -= delta;
            for(int k = 1; k <= h; k++)
                if (vy[k] == 1) ly[k] += delta;
        }
    }
    return 1;
}

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m) && n)
    {
        house.clear(),people.clear();
        rep(i,1,n)
        {
            scanf("%s",s[i] + 1);
        }
        rep(i,1,n)
        {
            rep(j,1,m)
            {
                if(s[i][j] == 'm') people.pb({i,j});
                else if(s[i][j] == 'H') house.pb({i,j});
            }
        }
        p = people.size(),h = house.size();
        for(int i=0; i<p; i++)
        {
            for(int j=0; j<h; j++)
            {
                int temp = -abs(people[i].fi - house[j].fi) - abs(people[i].se - house[j].se);
                a[i+1][j+1] = temp;
            }
        }
        if(deal() == 1)
        {
            int ans = 0;
            for(int i=1; i<=h; i++)
            {
                ans += a[match[i]][i];
            }
            cout<< -ans <<"\n";
        }
    }
    return 0;
}

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!"); 
    }
}
print('Hello world!')