#include <bits/stdc++.h>
constexpr int MAXN = 2000;
using namespace std;
int ok(array<int, 26> &cnts) {
int nz = 0;
for (int i = 0; i < 26; i++) if (cnts[i]) {
if (nz) return 0;
nz = i + 1;
}
return nz;
}
void solve() {
int h, w;
cin >> h >> w;
array<array<int, 26>, MAXN> rcnt, ccnt;
for (auto &a : rcnt) fill(a.begin(), a.end(), 0);
for (auto &a : ccnt) fill(a.begin(), a.end(), 0);
string s;
for (int r = 0; r < h; r++) {
cin >> s;
for (int c = 0; c < w; c++) {
int ix = s[c] - 'A';
rcnt[r][ix]++;
ccnt[c][ix]++;
}
}
queue<array<int, 2>> rs, cs;
for (int r = 0; r < h; r++) {
int ix = ok(rcnt[r]);
if (!ix) continue;
ix--;
rs.push({r, ix});
}
for (int c = 0; c < w; c++) {
int ix = ok(ccnt[c]);
if (!ix) continue;
ix--;
cs.push({c, ix});
}
vector<array<int, 3>> res;
while (rs.size() || cs.size()) {
if (rs.size()) {
auto [r, ix] = rs.front();
rs.pop();
rcnt[r][ix] = 0;
res.push_back({'R', r + 1, 'A' + ix});
for (int c = 0; c < w; c++) {
if (ccnt[c][ix]) if (!--ccnt[c][ix]) if (int nix; (nix = ok(ccnt[c]))) {
cs.push({c, nix - 1});
}
}
} else {
auto [c, ix] = cs.front();
cs.pop();
ccnt[c][ix] = 0;
res.push_back({'K', c + 1, 'A' + ix});
for (int r = 0; r < h; r++) {
if (rcnt[r][ix]) if (!--rcnt[r][ix]) if (int nix; (nix = ok(rcnt[r]))) {
rs.push({r, nix - 1});
}
}
}
}
reverse(res.begin(), res.end());
cout << res.size() << '\n';
for (auto &e : res) {
cout << char(e[0]) << " " << e[1] << " " << char(e[2]) << '\n';
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
// #ifdef LOCAL
// int t; cin >> t; while (t--)
// #endif
solve();
cout.flush();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <bits/stdc++.h> constexpr int MAXN = 2000; using namespace std; int ok(array<int, 26> &cnts) { int nz = 0; for (int i = 0; i < 26; i++) if (cnts[i]) { if (nz) return 0; nz = i + 1; } return nz; } void solve() { int h, w; cin >> h >> w; array<array<int, 26>, MAXN> rcnt, ccnt; for (auto &a : rcnt) fill(a.begin(), a.end(), 0); for (auto &a : ccnt) fill(a.begin(), a.end(), 0); string s; for (int r = 0; r < h; r++) { cin >> s; for (int c = 0; c < w; c++) { int ix = s[c] - 'A'; rcnt[r][ix]++; ccnt[c][ix]++; } } queue<array<int, 2>> rs, cs; for (int r = 0; r < h; r++) { int ix = ok(rcnt[r]); if (!ix) continue; ix--; rs.push({r, ix}); } for (int c = 0; c < w; c++) { int ix = ok(ccnt[c]); if (!ix) continue; ix--; cs.push({c, ix}); } vector<array<int, 3>> res; while (rs.size() || cs.size()) { if (rs.size()) { auto [r, ix] = rs.front(); rs.pop(); rcnt[r][ix] = 0; res.push_back({'R', r + 1, 'A' + ix}); for (int c = 0; c < w; c++) { if (ccnt[c][ix]) if (!--ccnt[c][ix]) if (int nix; (nix = ok(ccnt[c]))) { cs.push({c, nix - 1}); } } } else { auto [c, ix] = cs.front(); cs.pop(); ccnt[c][ix] = 0; res.push_back({'K', c + 1, 'A' + ix}); for (int r = 0; r < h; r++) { if (rcnt[r][ix]) if (!--rcnt[r][ix]) if (int nix; (nix = ok(rcnt[r]))) { rs.push({r, nix - 1}); } } } } reverse(res.begin(), res.end()); cout << res.size() << '\n'; for (auto &e : res) { cout << char(e[0]) << " " << e[1] << " " << char(e[2]) << '\n'; } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); // #ifdef LOCAL // int t; cin >> t; while (t--) // #endif solve(); cout.flush(); } |
English