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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// clang-format off
#include <bits/stdc++.h>

using namespace std;

#define ALL(x) (x).begin(), (x).end()

template<class C> void mini(C &a5, C b5) { a5 = min(a5, b5); }
template<class C> void maxi(C &a5, C b5) { a5 = max(a5, b5); }

#ifdef LOCAL
const bool debug = true;
#else
const bool debug = false;
#define cerr if (true) {} else cout
#endif
// clang-format on

#define int long long
#define double long double

const int INF = 1e18;
const int mod = 1e9 + 7;

const int nax = 2010;

int n, m;
int rzad[nax][200]; // 0 -> n kolorów; 'A' -> liczba koloru 'A', ...
int kol[nax][200];
char tab[nax][nax];

struct AnswerLine {
    char type;
    int x;
    char c;

    AnswerLine(char type_, int x_) : type(type_), x(x_) {
        int y = 1;
        if (type == 'R') {
            rzad[x][0] = 0;
            do {
                c = tab[x][y];
                y++;
            } while (c == 0);
        } else {
            kol[x][0] = 0;
            do {
                c = tab[y][x];
                y++;
            } while (c == 0);
        }
    }
};
vector<AnswerLine> ans;

inline void increase(int *x, int c) {
    if (x[c]++ == 0)
        x[0]++;
}

inline void decrease(int *x, int c) {
    if (--x[c] == 0)
        x[0]--;
}

void draw_rectangle(int x1, int y1, int x2, int y2) {
    for (int r = x1; r <= x2; r++)
        for (int k = y1; k <= y2; k++) {
            decrease(rzad[r], tab[r][k]);
            decrease(kol[k], tab[r][k]);
            tab[r][k] = 0;
        }

    for (int r = x1; r <= x2; r++)
        for (int k = y1; k <= y2; k++) {
            if (rzad[r][0] == 1) {
                ans.push_back({'R', r});
            }
            if (kol[k][0] == 1) {
                ans.push_back({'K', k});
            }
        }
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int r = 1; r <= n; r++)
        for (int k = 1; k <= m; k++) {
            char c;
            cin >> c;
            tab[r][k] = c;
            increase(rzad[r], c);
            increase(kol[k], c);
        }

    for (int r = 1; r <= n; r++)
        for (int k = 1; k <= m; k++) {
            if (rzad[r][0] == 1)
                ans.push_back({'R', r});
            if (kol[k][0] == 1)
                ans.push_back({'K', k});
        }

    for (size_t i = 0; i < ans.size(); i++) {
        const AnswerLine &a = ans[i];
        if (a.type == 'R') {
            draw_rectangle(a.x, 1, a.x, m);
        } else {
            draw_rectangle(1, a.x, n, a.x);
        }
    }

    reverse(ALL(ans));
    cout << ans.size() << '\n';
    for (const AnswerLine &a : ans)
        cout << a.type << ' ' << a.x << ' ' << a.c << '\n';

    return 0;
} /*

 */