// https://sio2.mimuw.edu.pl/c/pa-2024-1/p/lam/
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define all(x) x.begin(), x.end()
#define rep(i, a) for (int i = 0; i < (a); i++)
#define rep1(i, a) for (int i = 1; i <= (a); i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
const int MAX_N = 2e4 + 5;
int cnt[2][MAX_N];
int don[2][MAX_N];
string tab[MAX_N];
enum dir { ROW, COL };
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
map<char, int> h[MAX_N]; // opis wiersza
map<char, int> w[MAX_N]; // opis kolumny
rep(i, n) cin >> tab[i];
rep(i, n) rep(j, m) {
h[j][tab[i][j]]++;
w[i][tab[i][j]]++;
}
queue<pi> q; // 0 koluma, 1 wiersz; nr rzedu
// cerr << 'h';
rep(i, m) {
// cerr << i << ' ' << h[i].size() << "\n ";
cnt[COL][i] = h[i].size();
if (h[i].size() == 1)
q.push({COL, i});
}
// cerr << 'w';
rep(i, n) {
// cerr << i << ' ' << w[i].size() << "\n ";
// for(auto [a,b]:h[i])cerr<<a<<','<<b<<'\n';
cnt[ROW][i] = w[i].size();
if (w[i].size() == 1)
q.push({ROW, i});
}
// rep(i, 2) {
// rep(j, n) cerr << cnt[i][j] << ' ';
// cerr << '\n';
// }
vector<string> res;
while (!q.empty()) {
auto [d, nr] = q.front();
q.pop();
if (don[d][nr])
continue;
don[d][nr] = 1;
// cerr << "s" << d << ' ' << nr << '\n';
cnt[d][nr] = 0;
if (d == COL) {
rep(i, n) {
if (tab[i][nr]) {
w[i][tab[i][nr]]--;
// cerr << "r" << i << ' ' << cnt[ROW][i] << '\n';
if (w[i][tab[i][nr]] == 0) {
w[i].erase(tab[i][nr]);
cnt[ROW][i]--;
}
if (cnt[ROW][i] == 1)
q.push({ROW, i});
}
tab[i][nr] = 0;
}
if (h[nr].size())
res.pb("K " + to_string(nr + 1) + ' ' + h[nr].begin()->st);
h[nr].clear();
} else {
rep(i, m) {
if (tab[nr][i]) {
h[i][tab[nr][i]]--;
if (h[i][tab[nr][i]] == 0) {
h[i].erase(tab[nr][i]);
cnt[COL][i]--;
}
if (cnt[COL][i] == 1)
q.push({COL, i});
}
tab[nr][i] = 0;
}
if (w[nr].size())
res.pb("R " + to_string(nr + 1) + ' ' + w[nr].begin()->st);
w[nr].clear();
}
}
reverse(all(res));
cout << res.size() << '\n';
for (auto i : res)
cout << i << '\n';
// rep(i, 2) {
// rep(j, n) cerr << cnt[i][j] << ' ';
// cerr << '\n';
// }
}
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | // https://sio2.mimuw.edu.pl/c/pa-2024-1/p/lam/ #include <bits/stdc++.h> #define st first #define nd second #define pb push_back #define all(x) x.begin(), x.end() #define rep(i, a) for (int i = 0; i < (a); i++) #define rep1(i, a) for (int i = 1; i <= (a); i++) using namespace std; typedef long long ll; typedef pair<int, int> pi; const int MAX_N = 2e4 + 5; int cnt[2][MAX_N]; int don[2][MAX_N]; string tab[MAX_N]; enum dir { ROW, COL }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; map<char, int> h[MAX_N]; // opis wiersza map<char, int> w[MAX_N]; // opis kolumny rep(i, n) cin >> tab[i]; rep(i, n) rep(j, m) { h[j][tab[i][j]]++; w[i][tab[i][j]]++; } queue<pi> q; // 0 koluma, 1 wiersz; nr rzedu // cerr << 'h'; rep(i, m) { // cerr << i << ' ' << h[i].size() << "\n "; cnt[COL][i] = h[i].size(); if (h[i].size() == 1) q.push({COL, i}); } // cerr << 'w'; rep(i, n) { // cerr << i << ' ' << w[i].size() << "\n "; // for(auto [a,b]:h[i])cerr<<a<<','<<b<<'\n'; cnt[ROW][i] = w[i].size(); if (w[i].size() == 1) q.push({ROW, i}); } // rep(i, 2) { // rep(j, n) cerr << cnt[i][j] << ' '; // cerr << '\n'; // } vector<string> res; while (!q.empty()) { auto [d, nr] = q.front(); q.pop(); if (don[d][nr]) continue; don[d][nr] = 1; // cerr << "s" << d << ' ' << nr << '\n'; cnt[d][nr] = 0; if (d == COL) { rep(i, n) { if (tab[i][nr]) { w[i][tab[i][nr]]--; // cerr << "r" << i << ' ' << cnt[ROW][i] << '\n'; if (w[i][tab[i][nr]] == 0) { w[i].erase(tab[i][nr]); cnt[ROW][i]--; } if (cnt[ROW][i] == 1) q.push({ROW, i}); } tab[i][nr] = 0; } if (h[nr].size()) res.pb("K " + to_string(nr + 1) + ' ' + h[nr].begin()->st); h[nr].clear(); } else { rep(i, m) { if (tab[nr][i]) { h[i][tab[nr][i]]--; if (h[i][tab[nr][i]] == 0) { h[i].erase(tab[nr][i]); cnt[COL][i]--; } if (cnt[COL][i] == 1) q.push({COL, i}); } tab[nr][i] = 0; } if (w[nr].size()) res.pb("R " + to_string(nr + 1) + ' ' + w[nr].begin()->st); w[nr].clear(); } } reverse(all(res)); cout << res.size() << '\n'; for (auto i : res) cout << i << '\n'; // rep(i, 2) { // rep(j, n) cerr << cnt[i][j] << ' '; // cerr << '\n'; // } } |
English