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
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;

struct odp{
    char malowanie;
    int numer;
    char kolor;
};

int main(){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> wiersze (n, vector<int>(27, 0));
    vector<vector<int>> kolumny (m, vector<int>(27, 0));
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            char c;
            cin >> c;
            wiersze[i][c - 'A']++;
            kolumny[j][c - 'A']++;
        }
    }

    for (int i = 0; i < n; i++){
        wiersze[i][26] = i;
    }

    for (int i = 0; i < m; i++){
        kolumny[i][26] = i;
    }

    stack<odp> stos;

    while (!wiersze.empty() && !kolumny.empty()){
        for (int i = 0; i < wiersze.size(); i++){
            bool czy = false;
            char kolor;
            for(int j = 0; j < 26; j++){
                if(wiersze[i][j] > 0 && czy == false){
                    czy = true;
                    kolor = j + 'A';
                }else if(wiersze[i][j] > 0 && czy == true){
                    czy = false;
                    break;
                }
            }

            if(czy){
                odp o = {'R', wiersze[i][26], kolor};
                stos.push(o);
                wiersze.erase(wiersze.begin() + i);
                for (int j = 0; j < kolumny.size(); j++){
                    kolumny[j][kolor - 'A']--;
                }
                i--;
            }
        }

        for (int i = 0; i < kolumny.size(); i++){
            bool czy = false;
            char kolor;
            for(int j = 0; j < 26; j++){
                if(kolumny[i][j] > 0 && czy == false){
                    czy = true;
                    kolor = j + 'A';
                }else if(kolumny[i][j] > 0 && czy == true){
                    czy = false;
                    break;
                }
            }

            if(czy){
                odp o = {'K', kolumny[i][26], kolor};
                stos.push(o);
                kolumny.erase(kolumny.begin() + i);
                for (int j = 0; j < wiersze.size(); j++){
                    wiersze[j][kolor - 'A']--;
                }
                i--;
            }
        }

        //cout << wiersze.size() << " " << kolumny.size() << "\n";
    }

    cout << stos.size() << "\n";
    while (!stos.empty()){
        cout << stos.top().malowanie << " " << stos.top().numer+1 << " " << stos.top().kolor << "\n";
        stos.pop();
    }

}