/*
* author : 3hmed_124M
*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define el '\n'
#define all(v) v.begin(), v.end()
const int mod = 1e9 + 7;
int dx[] = {-1, 0, 0, 1};
int dy[] = {0, 1, -1, 0};
void solve() {
int n, m;
cin >> n >> m;
vector<vector<char>>grid(n, vector<char>(m));
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
cin >> grid[i][j];
}
}
vector<vector<bool>>vis(n, vector<bool>(m));
function<bool(int, int, char)> isvalid = [&](int i, int j, char ch) -> bool {
return (i >= 0 && i <= n - 1 && j >= 0 && j <= m - 1 && !vis[i][j] && grid[i][j] == ch);
};
function<void(int, int, char)> concted = [&](int i, int j, char ch) -> void {
if(!isvalid(i, j, ch)) {
return;
}
vis[i][j] = 1;
for(int idx = 0; idx < 4; ++idx) {
concted(i + dx[idx], j + dy[idx], ch);
}
};
int cnt = 0;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
if(!vis[i][j]) {
concted(i, j, grid[i][j]);
cnt++;
}
}
}
cout << cnt << el;
}
int32_t main() {
ios_base::sync_with_stdio(false);
cout.tie(NULL), cin.tie(NULL);
// if(fopen("in.txt", "r")){
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
// }
int tt = 1;
// cin >> tt;
while (tt--) {
solve();
}
return 0;
}
LyoKKiAgICAgICBhdXRob3IgOiAgM2htZWRfMTI0TQoqLwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCAgICAgbG9uZyBsb25nCiNkZWZpbmUgaW50ICAgIGxvbmcgbG9uZwojZGVmaW5lIGVsICAgICAnXG4nCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSwgdi5lbmQoKQpjb25zdCBpbnQgbW9kID0gMWU5ICsgNzsKaW50IGR4W10gPSB7LTEsIDAsIDAsIDF9OwppbnQgZHlbXSA9IHswLCAxLCAtMSwgMH07Cgp2b2lkIHNvbHZlKCkgewogICAgIAogICAgaW50IG4sIG07CiAgICBjaW4gPj4gbiA+PiBtOwogICAgdmVjdG9yPHZlY3RvcjxjaGFyPj5ncmlkKG4sIHZlY3RvcjxjaGFyPihtKSk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGNpbiA+PiBncmlkW2ldW2pdOwogICAgICAgIH0KICAgIH0KCiAgICB2ZWN0b3I8dmVjdG9yPGJvb2w+PnZpcyhuLCB2ZWN0b3I8Ym9vbD4obSkpOwoKICAgIGZ1bmN0aW9uPGJvb2woaW50LCBpbnQsIGNoYXIpPiBpc3ZhbGlkID0gWyZdKGludCBpLCBpbnQgaiwgY2hhciBjaCkgLT4gYm9vbCB7CgogICAgICAgcmV0dXJuIChpID49IDAgJiYgaSA8PSBuIC0gMSAmJiBqID49IDAgJiYgaiA8PSBtIC0gMSAmJiAhdmlzW2ldW2pdICYmIGdyaWRbaV1bal0gPT0gY2gpOwoKICAgIH07CgogICAgZnVuY3Rpb248dm9pZChpbnQsIGludCwgY2hhcik+IGNvbmN0ZWQgPSBbJl0oaW50IGksIGludCBqLCBjaGFyIGNoKSAtPiB2b2lkIHsKCiAgICAgICAgaWYoIWlzdmFsaWQoaSwgaiwgY2gpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZpc1tpXVtqXSA9IDE7CiAgICAgICAgZm9yKGludCBpZHggPSAwOyBpZHggPCA0OyArK2lkeCkgewogICAgICAgICAgIGNvbmN0ZWQoaSArIGR4W2lkeF0sIGogKyBkeVtpZHhdLCBjaCk7CiAgICAgICAgfQoKICAgIH07CiAgICAKCiAgICBpbnQgY250ID0gMDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgIGlmKCF2aXNbaV1bal0pIHsKICAgICAgICAgICAgICAgIGNvbmN0ZWQoaSwgaiwgZ3JpZFtpXVtqXSk7CiAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IGNudCA8PCBlbDsKCgp9CmludDMyX3QgbWFpbigpIHsKCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNvdXQudGllKE5VTEwpLCBjaW4udGllKE5VTEwpOwoKICAgIC8vIGlmKGZvcGVuKCJpbi50eHQiLCAiciIpKXsgIAogICAgLy8gICAgIGZyZW9wZW4oImluLnR4dCIsICJyIiwgc3RkaW4pOwogICAgLy8gICAgIGZyZW9wZW4oIm91dC50eHQiLCAidyIsIHN0ZG91dCk7CiAgICAvLyB9CgogICAgaW50IHR0ID0gMTsKICAgLy8gY2luID4+IHR0OwogICAgd2hpbGUgKHR0LS0pIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQoKICAgIHJldHVybiAwOwp9IA==