/* * Author: toko * Time: 2024-03-15 22:00:00 // 00:01:52 - czemu taki czas był */ #ifndef DEBUG #define NDEBUG #pragma GCC optimize("Ofast,unroll-loops") #else #pragma GCC optimize("Og") #endif #include <iostream> #include <vector> #include <array> using namespace std; struct Ruch { signed char rodzaj; int numer; signed char kolor; }; pair<int, char> znajdz_jednokolorowy(vector<array<int, 26>>& kolory) { for (int i = 0; i < (int) kolory.size(); i++) { signed char kolor = -1; for (int j = 0; j < 26; j++) { if (kolory[i][j] > 0) { if (kolor != -1) { kolor = -1; break; } kolor = j; } } if (kolor != -1) return { i, kolor }; } return { -1, -1 }; } int main() { iostream::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m; cin >> n >> m; vector<vector<signed char>> plansza(n, vector<signed char>(m)); vector<array<int, 26>> kolory_rzedy(n, array<int, 26>()), kolory_kolumny(m, array<int, 26>()); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> plansza[i][j]; kolory_rzedy[i][plansza[i][j] - 'A']++; kolory_kolumny[j][plansza[i][j] - 'A']++; } } vector<Ruch> ruchy; while (true) { auto [rzad, kolor] = znajdz_jednokolorowy(kolory_rzedy); if (rzad == -1) { auto [kolumna, kolor] = znajdz_jednokolorowy(kolory_kolumny); if (kolumna == -1) break; ruchy.emplace_back('K', kolumna + 1, kolor + 'A'); kolory_kolumny[kolumna][kolor] -= n; for (int i = 0; i < n; i++) { kolory_rzedy[i][kolor]--; plansza[i][kolumna] = '\0'; } } else { ruchy.emplace_back('R', rzad + 1, kolor + 'A'); kolory_rzedy[rzad][kolor] -= m; for (int j = 0; j < m; j++) { kolory_kolumny[j][kolor]--; plansza[rzad][j] = '\0'; } } } cout << ruchy.size() << '\n'; for (int i = ruchy.size() - 1; i >= 0; i--) { auto& ruch = ruchy[i]; cout << ruch.rodzaj << ' ' << ruch.numer << ' ' << ruch.kolor << '\n'; } return 0; }
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 103 104 105 106 107 108 109 110 | /* * Author: toko * Time: 2024-03-15 22:00:00 // 00:01:52 - czemu taki czas był */ #ifndef DEBUG #define NDEBUG #pragma GCC optimize("Ofast,unroll-loops") #else #pragma GCC optimize("Og") #endif #include <iostream> #include <vector> #include <array> using namespace std; struct Ruch { signed char rodzaj; int numer; signed char kolor; }; pair<int, char> znajdz_jednokolorowy(vector<array<int, 26>>& kolory) { for (int i = 0; i < (int) kolory.size(); i++) { signed char kolor = -1; for (int j = 0; j < 26; j++) { if (kolory[i][j] > 0) { if (kolor != -1) { kolor = -1; break; } kolor = j; } } if (kolor != -1) return { i, kolor }; } return { -1, -1 }; } int main() { iostream::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m; cin >> n >> m; vector<vector<signed char>> plansza(n, vector<signed char>(m)); vector<array<int, 26>> kolory_rzedy(n, array<int, 26>()), kolory_kolumny(m, array<int, 26>()); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> plansza[i][j]; kolory_rzedy[i][plansza[i][j] - 'A']++; kolory_kolumny[j][plansza[i][j] - 'A']++; } } vector<Ruch> ruchy; while (true) { auto [rzad, kolor] = znajdz_jednokolorowy(kolory_rzedy); if (rzad == -1) { auto [kolumna, kolor] = znajdz_jednokolorowy(kolory_kolumny); if (kolumna == -1) break; ruchy.emplace_back('K', kolumna + 1, kolor + 'A'); kolory_kolumny[kolumna][kolor] -= n; for (int i = 0; i < n; i++) { kolory_rzedy[i][kolor]--; plansza[i][kolumna] = '\0'; } } else { ruchy.emplace_back('R', rzad + 1, kolor + 'A'); kolory_rzedy[rzad][kolor] -= m; for (int j = 0; j < m; j++) { kolory_kolumny[j][kolor]--; plansza[rzad][j] = '\0'; } } } cout << ruchy.size() << '\n'; for (int i = ruchy.size() - 1; i >= 0; i--) { auto& ruch = ruchy[i]; cout << ruch.rodzaj << ' ' << ruch.numer << ' ' << ruch.kolor << '\n'; } return 0; } |