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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//Jakub Nowak XIV LO Wroclaw
#include<bits/stdc++.h>
using namespace std;

#define boost ios_base::sync_with_stdio(false); cin.tie(0);
#define int long long
#define vi vector<int>
#define pii pair<int,int>
#define pb push_back
#define st first
#define nd second
const int inf = (int)(1e18)+7;

/*void wypisz(auto &X) {
    for(auto &x : X) cout << x << " ";
    cout << "\n";
}

void wypisz_pair(auto &X) {
    for(auto &x : X) cout << x.st << "|" << x.nd << " ";
    cout << "\n";
}*/

struct ruch {
    bool czy_kolumna = false;
    int nr;
    char kolor;
};

struct alfabet {
    bool czy_pusty = false;
    int ile_niepuste = 0;
    vi A = vi(27, 0);
    void dodaj(char c) {
        if(A[c -'A' + 1] == 0) ile_niepuste++;
        A[c - 'A' + 1] ++;
    }
    void usun(char c) {
        A[c - 'A' + 1] --;
        if(A[c - 'A' + 1] == 0) ile_niepuste--;
    }
    bool gotowe() {//czy ma tylko jedne kolor?
        return (ile_niepuste == 1);
    }
    bool empty() {
        return czy_pusty;
    }
    void clear() {
        czy_pusty = true;
    }
    char kolor() {//dziala tylko, gdy gotowe i zwraca jedyny kolor w rzedzie
        for(int i=1; i<=26; i++) if(A[i] != 0) return char(i+'A'-1);
        return 'Z';
    }
};

void solve() {
    int n, m;//n - rzedy, m - kolumny
    vector<alfabet> KOLORKI[2] = {vector<alfabet>(1), vector<alfabet>(1)};//KOLORKI[czy_kolumna][nr_wiersza/kolumny][litera-'A'+1] = ile w danym wierszu/kolumnie jest aktualnie liter litera
    vector<pair<bool,int>> GOTOWE;//{czy_kolumna, nr_wiersza/kolumny}
    vector<ruch> ANS(1, {false, 0, 0});

    cin >> n >> m;

    KOLORKI[false] = vector<alfabet>(n+1);
    KOLORKI[true] = vector<alfabet>(m+1);

    for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) {
        char c;
        cin >> c;
        //KOLORKI[false][i][c - 'A' + 1]++;
        //KOLORKI[true][j][c - 'A' + 1]++;
        KOLORKI[false][i].dodaj(c);
        KOLORKI[true][j].dodaj(c);
    }

    /*cout << "KOLORKI:\n";
    cout << "Wiersze:\n";
    for(int i=0; i<KOLORKI[false].size(); i++) {
        cout << i << ": ";
        for(int j=1; j<=26; j++) cout << KOLORKI[false][i].A[j] << " ";
        cout << "\n";
    }
    cout << "Kolumny:\n";
    for(int i=0; i<KOLORKI[true].size(); i++) {
        cout << i << ": ";
        for(int j=1; j<=26; j++) cout << KOLORKI[true][i].A[j] << " ";
        cout << "\n";
    }
    //return;*/

    /*function(bool(vi)) gotowe = [&](vi &A) {
        int zera = 0;
        for(int i=1; i<=26; i++) if(A[i] == 0) zera++;
        if(zera == 25) return true;
        return false;
    }*/

    function<void(pair<bool,int>)> remove = [&](pair<bool, int> x) {
        auto &u = KOLORKI[x.st][x.nd];
        char kol = u.kolor();
        ANS.pb({x.st, x.nd, kol});
        for(int i=1; i <= (x.st ? n : m); i++) {//
            auto &nowy = KOLORKI[!x.st][i];
            if(nowy.empty()) continue;
            bool czy_byl_gotowy = nowy.gotowe();
            nowy.usun(kol);
            if(nowy.gotowe() && !czy_byl_gotowy) GOTOWE.pb({!x.st, i});
        }
        u.clear();
    };

    for(int i = 1; i <= n; i++) {
        if(KOLORKI[false][i].gotowe()) GOTOWE.pb({false, i});
    }
    for(int i = 1; i <= m; i++) {
        if(KOLORKI[true][i].gotowe()) GOTOWE.pb({true, i});
    }

    //wypisz_pair(GOTOWE);
    //return;

    while(!GOTOWE.empty()) {
        auto x = GOTOWE.back();
        GOTOWE.pop_back();
        remove(x);//co sie dzieje gdy usuwamy alfabet pusty? (tj. o alfabet kolumny/rzedu o dlugosci 0)
    }

    //reverse(ANS.begin()+1, ANS.end());
    cout << ANS.size()-1 << "\n";
    for(int i=ANS.size()-1; i>=1; i--) {
        auto &u = ANS[i];
        cout << (u.czy_kolumna ? "K" : "R") << " " << u.nr << " " << u.kolor << "\n";
    }
}

int32_t main() {
    boost
    //cout << (int)('Z'-'A');
    solve();
}