// 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'; // } } |