#include <iostream> // using g++ -Wall -std=c++14
#include <vector>
#include <set>
#include <bitset>
#include <numeric>
using namespace std;
int m, n, ans; // room of m x n dimensions
vector<string> floorPlan; // each string is 4 char long composed of '0' and '1'
vector<int> parent, ranks; // each room is a seperate component in worst case
int findSet(int x) {
if(parent[x] != x)
parent[x] = findSet(parent[x]);
return parent[x];
}
void unionSet(int x, int y) {
int px = findSet(x);
int py = findSet(y);
if(ranks[px] > ranks[py])
parent[py] = px;
else
parent[px] = py;
if(ranks[px] == ranks[py])
ranks[py]++;
}
void inp() {
string temp;
cin >> m >> n;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++) {
cin >> temp;
floorPlan.push_back(temp);
}
}
void solve() {
// set up Disjoint Sets
parent.resize(m*n);
ranks.resize(m*n, 0);
iota(parent.begin(), parent.end(), 0);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++) {
bitset<4> tile(floorPlan[i*n+j]);
// process West wall
if(j > 0 && (tile[3] == 0))
unionSet(i*n+j, i*n+j-1);
// process North wall
if(i > 0 && (tile[2] == 0))
unionSet(i*n+j, (i-1)*n+j);
}
set<int> temp;
for(int i=0; i<m*n; i++) {
// normalise each tile
parent[i] = findSet(parent[i]);
temp.insert(parent[i]);
}
ans = temp.size();
}
void outp() {
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++)
cout << parent[i*n+j] << " ";
cout << endl;
}
cout << "\n" << ans << endl;
}
int main() {
inp();
solve();
outp();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAvLyB1c2luZyBnKysgLVdhbGwgLXN0ZD1jKysxNAojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8bnVtZXJpYz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtLCBuLCBhbnM7IC8vIHJvb20gb2YgbSB4IG4gZGltZW5zaW9ucwp2ZWN0b3I8c3RyaW5nPiBmbG9vclBsYW47IC8vIGVhY2ggc3RyaW5nIGlzIDQgY2hhciBsb25nIGNvbXBvc2VkIG9mICcwJyBhbmQgJzEnCnZlY3RvcjxpbnQ+IHBhcmVudCwgcmFua3M7IC8vIGVhY2ggcm9vbSBpcyBhIHNlcGVyYXRlIGNvbXBvbmVudCBpbiB3b3JzdCBjYXNlCgppbnQgZmluZFNldChpbnQgeCkgewogIGlmKHBhcmVudFt4XSAhPSB4KQogICAgcGFyZW50W3hdID0gZmluZFNldChwYXJlbnRbeF0pOwogIHJldHVybiBwYXJlbnRbeF07Cn0KCnZvaWQgdW5pb25TZXQoaW50IHgsIGludCB5KSB7CiAgaW50IHB4ID0gZmluZFNldCh4KTsKICBpbnQgcHkgPSBmaW5kU2V0KHkpOwoKICBpZihyYW5rc1tweF0gPiByYW5rc1tweV0pCiAgICBwYXJlbnRbcHldID0gcHg7CiAgZWxzZQogICAgcGFyZW50W3B4XSA9IHB5OwoKICBpZihyYW5rc1tweF0gPT0gcmFua3NbcHldKQogICAgcmFua3NbcHldKys7Cn0KCnZvaWQgaW5wKCkgewogIHN0cmluZyB0ZW1wOwoKICBjaW4gPj4gbSA+PiBuOwoKICBmb3IoaW50IGk9MDsgaTxtOyBpKyspCiAgICBmb3IoaW50IGo9MDsgajxuOyBqKyspIHsKICAgICAgY2luID4+IHRlbXA7CiAgICAgIGZsb29yUGxhbi5wdXNoX2JhY2sodGVtcCk7CiAgICB9Cn0KCnZvaWQgc29sdmUoKSB7CiAgLy8gc2V0IHVwIERpc2pvaW50IFNldHMKICBwYXJlbnQucmVzaXplKG0qbik7CiAgcmFua3MucmVzaXplKG0qbiwgMCk7CiAgaW90YShwYXJlbnQuYmVnaW4oKSwgcGFyZW50LmVuZCgpLCAwKTsKCiAgZm9yKGludCBpPTA7IGk8bTsgaSsrKQogICAgZm9yKGludCBqPTA7IGo8bjsgaisrKSB7CiAgICAgIGJpdHNldDw0PiB0aWxlKGZsb29yUGxhbltpKm4ral0pOwoKICAgICAgLy8gcHJvY2VzcyBXZXN0IHdhbGwKICAgICAgaWYoaiA+IDAgJiYgKHRpbGVbM10gPT0gMCkpCiAgICAgICAgdW5pb25TZXQoaSpuK2osIGkqbitqLTEpOwoKICAgICAgLy8gcHJvY2VzcyBOb3J0aCB3YWxsCiAgICAgIGlmKGkgPiAwICYmICh0aWxlWzJdID09IDApKQogICAgICAgIHVuaW9uU2V0KGkqbitqLCAoaS0xKSpuK2opOwogICAgfQoKICBzZXQ8aW50PiB0ZW1wOwogIGZvcihpbnQgaT0wOyBpPG0qbjsgaSsrKSB7CiAgICAvLyBub3JtYWxpc2UgZWFjaCB0aWxlCiAgICBwYXJlbnRbaV0gPSBmaW5kU2V0KHBhcmVudFtpXSk7CiAgICB0ZW1wLmluc2VydChwYXJlbnRbaV0pOwogIH0KCiAgYW5zID0gdGVtcC5zaXplKCk7Cn0KCnZvaWQgb3V0cCgpIHsKICBmb3IoaW50IGk9MDsgaTxtOyBpKyspIHsKICAgIGZvcihpbnQgaj0wOyBqPG47IGorKykKICAgICAgY291dCA8PCBwYXJlbnRbaSpuK2pdIDw8ICIgICI7CiAgICBjb3V0IDw8IGVuZGw7CiAgfQoKICBjb3V0IDw8ICJcbiIgPDwgYW5zIDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewogIGlucCgpOwogIHNvbHZlKCk7CiAgb3V0cCgpOwogIHJldHVybiAwOwp9Cg==
NCA3CjExMDEgMDExMCAxMTAxIDAxMTAgMTEwMCAwMTAxIDAxMTAgCjExMTAgMTAwMSAwMTEwIDEwMTEgMTAxMCAxMTExIDEwMTAgCjEwMDAgMDEwMSAwMDExIDExMTAgMTAxMSAxMTEwIDEwMTAgCjEwMTEgMTEwMSAwMTAxIDAwMDEgMDEwMSAwMDExIDEwMTE=
4 7
1101 0110 1101 0110 1100 0101 0110
1110 1001 0110 1011 1010 1111 1010
1000 0101 0011 1110 1011 1110 1010
1011 1101 0101 0001 0101 0011 1011