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
#include <bits/stdc++.h>

using namespace std;
constexpr int M = 2005;
char plansza[M][M];
int kolumny[M][40];
int wiersze[M][40];

struct odp{
	char a;
	int b;
	char c;
};

int main(){
	cin.tie(0)->sync_with_stdio(0);
	int n, m;
	cin>>n>>m;
	for(int i=1; i<=n; i++) for(int j=1; j<=m; j++){
		cin>>plansza[i][j];
		wiersze[i][plansza[i][j]-'A']++;
		kolumny[j][plansza[i][j]-'A']++;
	}
	vector<odp> wyniki;
	int lastWynik = 0;
	while(true){
		lastWynik = wyniki.size();
		for(int i=1; i<=n; i++){
			bool czy = 0;
			bool czyOdp = 0;
			int last = 0;
			for(int j=0; j<=25; j++){
				if(wiersze[i][j]!=0 && czy==0) czy = 1, last = j;
				else if(wiersze[i][j]!=0){
					czyOdp = 1;
					break;
				}
			}
			if(czyOdp==0 && czy==1){
				wyniki.push_back({'R', i, char(last+'A')});
				wiersze[i][last] = 0;
				for(int j=1; j<=m; j++) kolumny[j][last] = max(kolumny[j][last]-1, 0);
			}
		}
		for(int i=1; i<=m; i++){
			bool czy = 0;
			bool czyOdp = 0;
			int last = 0;
			for(int j=0; j<=25; j++){
				if(kolumny[i][j]!=0 && czy==0) czy = 1, last = j;
				else if(kolumny[i][j]!=0){
					czyOdp = 1;
					break;
				}
			}
			if(czyOdp==0 && czy==1){
				wyniki.push_back({'K', i, char(last+'A')});
				kolumny[i][last] = 0;
				for(int j=1; j<=n; j++) wiersze[j][last] = max(wiersze[j][last]-1, 0);
			}
		}
		if(lastWynik==wyniki.size()) break;
	}
	cout<<wyniki.size()<<endl;
	reverse(wyniki.begin(), wyniki.end());
	for(auto i:wyniki) cout<<i.a<<" "<<i.b<<" "<<i.c<<endl;
	return 0;
}