#include <ios> #include <queue> #include <functional> #include <cassert> #include <vector> #define REP(i, n) for(int i=0; i<(n); ++i) #define SREP(n) REP(_ ## n, n) #define FOR(i, p, n) for(int i=(p); i<=(n); ++i) #define RFOR(i, p, n) for(int i=(p); i>=(n); --i) #define pb push_back #define eb emplace_back #define C const #define V std::vector #define F std::function #define R std::ranges #define RV std::ranges::views #define sz(A) int(A.size()) #define all(A) A.begin(), A.end() #define rall(A) A.rbegin(), A.rend() typedef long long ll; typedef long double ld; typedef V <int> vi; typedef V <vi> vvi; typedef V <bool> vb; typedef V <char> vc; typedef V <vc> vvc; typedef V <ll> vll; typedef const int ci; typedef const ll cll; int I(){ int z; while ((z=getchar_unlocked())<'0'||z>'9'); int r=z-'0'; while ((z=getchar_unlocked())>='0'&&z<='9') r=r*10+z-'0'; return r; } int main(){ ci n=I(),m=I(); vvc t(n, vc(m)); vvi kolt(m, vi(26)),wiert(n, vi(26)); REP(i, n){ scanf("\n"); REP(j, m){ t[i][j]=char(getchar_unlocked()-'A'); ++kolt[j][t[i][j]]; ++wiert[i][t[i][j]]; } } // 0 - niedotykane, 1 - na kolejce, 2 - już "wyczyszczone" vi kolczy(m),wierczy(n); struct op{ bool czykol; char kolor; int i; }; V <op> wyn; { std::queue <std::pair <bool, int>> kol; // czykol, i auto czyunik=[](C vi &v) -> bool{ int ile=0; for (ci i : v) ile+=bool(i); return ile==1; }; auto sprwier=[&](ci i){ if (czyunik(wiert[i])){ wierczy[i]=1; kol.emplace(0, i); } }; auto sprkol=[&](ci i){ if (czyunik(kolt[i])){ kolczy[i]=1; kol.emplace(1, i); } }; REP(i, n) sprwier(i); REP(i, m) sprkol(i); while (sz(kol)){ C auto [czykol, i]=kol.front(); kol.pop(); { C vi &v=czykol ? kolt[i] : wiert[i]; REP(a, 26) if (v[a]) wyn.eb(czykol, a, i); } if (czykol){ REP(j, n) if (!wierczy[j]){ --wiert[j][t[j][i]]; sprwier(j); } } else REP(j, m) if (!kolczy[j]){ --kolt[j][t[i][j]]; sprkol(j); } } } assert(sz(wyn)<=(n+m)); std::reverse(all(wyn)); printf("%d\n", sz(wyn)); for (C auto &[czykol, k, i] : wyn) printf("%c %d %c\n", czykol ? 'K' : 'R', i+1, k+'A'); }
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 | #include <ios> #include <queue> #include <functional> #include <cassert> #include <vector> #define REP(i, n) for(int i=0; i<(n); ++i) #define SREP(n) REP(_ ## n, n) #define FOR(i, p, n) for(int i=(p); i<=(n); ++i) #define RFOR(i, p, n) for(int i=(p); i>=(n); --i) #define pb push_back #define eb emplace_back #define C const #define V std::vector #define F std::function #define R std::ranges #define RV std::ranges::views #define sz(A) int(A.size()) #define all(A) A.begin(), A.end() #define rall(A) A.rbegin(), A.rend() typedef long long ll; typedef long double ld; typedef V <int> vi; typedef V <vi> vvi; typedef V <bool> vb; typedef V <char> vc; typedef V <vc> vvc; typedef V <ll> vll; typedef const int ci; typedef const ll cll; int I(){ int z; while ((z=getchar_unlocked())<'0'||z>'9'); int r=z-'0'; while ((z=getchar_unlocked())>='0'&&z<='9') r=r*10+z-'0'; return r; } int main(){ ci n=I(),m=I(); vvc t(n, vc(m)); vvi kolt(m, vi(26)),wiert(n, vi(26)); REP(i, n){ scanf("\n"); REP(j, m){ t[i][j]=char(getchar_unlocked()-'A'); ++kolt[j][t[i][j]]; ++wiert[i][t[i][j]]; } } // 0 - niedotykane, 1 - na kolejce, 2 - już "wyczyszczone" vi kolczy(m),wierczy(n); struct op{ bool czykol; char kolor; int i; }; V <op> wyn; { std::queue <std::pair <bool, int>> kol; // czykol, i auto czyunik=[](C vi &v) -> bool{ int ile=0; for (ci i : v) ile+=bool(i); return ile==1; }; auto sprwier=[&](ci i){ if (czyunik(wiert[i])){ wierczy[i]=1; kol.emplace(0, i); } }; auto sprkol=[&](ci i){ if (czyunik(kolt[i])){ kolczy[i]=1; kol.emplace(1, i); } }; REP(i, n) sprwier(i); REP(i, m) sprkol(i); while (sz(kol)){ C auto [czykol, i]=kol.front(); kol.pop(); { C vi &v=czykol ? kolt[i] : wiert[i]; REP(a, 26) if (v[a]) wyn.eb(czykol, a, i); } if (czykol){ REP(j, n) if (!wierczy[j]){ --wiert[j][t[j][i]]; sprwier(j); } } else REP(j, m) if (!kolczy[j]){ --kolt[j][t[i][j]]; sprkol(j); } } } assert(sz(wyn)<=(n+m)); std::reverse(all(wyn)); printf("%d\n", sz(wyn)); for (C auto &[czykol, k, i] : wyn) printf("%c %d %c\n", czykol ? 'K' : 'R', i+1, k+'A'); } |