#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair <int, int>;
using pll = pair <ll, ll>;
const int inf = 1e9+7;
const ll inf_ll = 1e18+7;
void boost ()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
struct Rzad {
char kierunek;
int nr;
int znak;
};
int h, w, tab[2007][2007];
string s;
int wiersze[2007][30], kolumny[2007][30];
bool czy_wiersz[2007], czy_kolumna[2007];
queue<Rzad> q;
vector<Rzad> v;
int main ()
{
boost();
cin >> h >> w;
for (int y = 1; y <= h; y++) {
cin >> s;
for (int x = 1; x <= w; x++) {
int znak = s[x - 1] - 'A';
tab[x][y] = znak;
wiersze[y][znak]++;
kolumny[x][znak]++;
if (wiersze[y][znak] == w) {
q.push({'R', y, znak});
czy_wiersz[y] = true;
}
if (kolumny[x][znak] == h) {
q.push({'K', x, znak});
czy_kolumna[x] = true;
}
}
}
while (!q.empty()) {
Rzad rzad = q.front();
q.pop();
v.push_back(rzad);
if (rzad.kierunek == 'R') {
for (int x = 1; x <= w; x++) {
for (int znak = 0; znak < 26; znak++) {
if (znak != rzad.znak)
kolumny[x][znak]++;
if (kolumny[x][znak] == h && !czy_kolumna[x]) {
q.push({'K', x, znak});
czy_kolumna[x] = true;
}
}
}
}
else {
for (int y = 1; y <= h; y++) {
for (int znak = 0; znak < 26; znak++) {
if (znak != rzad.znak)
wiersze[y][znak]++;
if (wiersze[y][znak] == w && !czy_wiersz[y]) {
q.push({'R', y, znak});
czy_wiersz[y] = true;
}
}
}
}
}
reverse(v.begin(), v.end());
cout << v.size() << "\n";
for (Rzad rzad: v) {
cout << rzad.kierunek << " " << rzad.nr << " " << (char)('A' + rzad.znak) << "\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 | #include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair <int, int>; using pll = pair <ll, ll>; const int inf = 1e9+7; const ll inf_ll = 1e18+7; void boost () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } struct Rzad { char kierunek; int nr; int znak; }; int h, w, tab[2007][2007]; string s; int wiersze[2007][30], kolumny[2007][30]; bool czy_wiersz[2007], czy_kolumna[2007]; queue<Rzad> q; vector<Rzad> v; int main () { boost(); cin >> h >> w; for (int y = 1; y <= h; y++) { cin >> s; for (int x = 1; x <= w; x++) { int znak = s[x - 1] - 'A'; tab[x][y] = znak; wiersze[y][znak]++; kolumny[x][znak]++; if (wiersze[y][znak] == w) { q.push({'R', y, znak}); czy_wiersz[y] = true; } if (kolumny[x][znak] == h) { q.push({'K', x, znak}); czy_kolumna[x] = true; } } } while (!q.empty()) { Rzad rzad = q.front(); q.pop(); v.push_back(rzad); if (rzad.kierunek == 'R') { for (int x = 1; x <= w; x++) { for (int znak = 0; znak < 26; znak++) { if (znak != rzad.znak) kolumny[x][znak]++; if (kolumny[x][znak] == h && !czy_kolumna[x]) { q.push({'K', x, znak}); czy_kolumna[x] = true; } } } } else { for (int y = 1; y <= h; y++) { for (int znak = 0; znak < 26; znak++) { if (znak != rzad.znak) wiersze[y][znak]++; if (wiersze[y][znak] == w && !czy_wiersz[y]) { q.push({'R', y, znak}); czy_wiersz[y] = true; } } } } } reverse(v.begin(), v.end()); cout << v.size() << "\n"; for (Rzad rzad: v) { cout << rzad.kierunek << " " << rzad.nr << " " << (char)('A' + rzad.znak) << "\n"; } return 0; } |
English