// compile: g++ -o data data.cpp -std=gnu++20 -DLOCAL -g
// run: ./data < data.in
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#ifdef LOCAL
#endif
#define sz(v) ((int)(v).size())
#define PV(v) for (int i=0;i<v.size();++i)cout<<v[i]<<" ";cout<<endl;
#define OK cout<<"OK"<<endl;
#define INTINF 9223372036854775807
#define int long long
#define MAXN 1000010
using namespace std;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
vector<string> mp;
vector<int> e[MAXN];
vector<bool> vis;
int n, m;
bool ok(int x, int y) {return x>=0 && y>=0 && x<n && y<m && mp[x][y]=='.'; }
void dfs(int x) {
vis[x] = 1;
for (auto it = e[x].begin(); it != e[x].end(); ++it) if (!vis[*it]) dfs(*it);
}
int32_t main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < n; ++i) {
string s; cin >> s;
mp.push_back(s);
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (mp[i][j] == '#') continue;
int u = i*m + j;
for (int k = 0; k < 4; ++k) {
if (!ok(i + dir[k][0], j + dir[k][1])) continue;
int v = (i + dir[k][0]) * m + (j + dir[k][1]);
e[u].push_back(v);
e[v].push_back(u);
}
}
}
vis.assign(n*m, false);
int cnt = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
int u = i*m + j;
if (mp[i][j] == '#' || vis[u]) continue;
dfs(u);
++cnt;
}
}
cout << cnt << endl;
return 0;
}
No Comments