#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'); } |
English