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
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <iostream>
#include <queue>
#include <string>
#include <vector>

using namespace std;
using LL = long long;
using PII = pair<int, int>;

vector<string> solve(int n, int m, const vector<vector<int>>& board, vector<vector<int>>& row_cnt, vector<vector<int>>& col_cnt, vector<int>& row_sum, vector<int>& col_sum)
{
	vector<string> res;
	queue<PII> q;

	for (int i = 0; i < n; ++i)
	{
		if (row_sum[i] == 1)
			q.push({ 0, i });
	}

	for (int i = 0; i < m; ++i)
	{
		if (col_sum[i] == 1)
			q.push({ 1, i });
	}

	while (!q.empty())
	{
		PII cur = q.front();
		q.pop();

		if (cur.first == 0)
		{
			if (row_sum[cur.second] == 1)
			{
				row_sum[cur.second] == 0;

				for (int j = 0; j < 26; j++)
				{
					if (row_cnt[cur.second][j] > 0)
					{
						row_cnt[cur.second][j] = 0;
						res.push_back("R " + to_string(cur.second + 1) + " " + (char)('A' + j));
					}
				}
			}

			for (int i = 0; i < m; ++i)
			{
				if (col_sum[i] == 0)
					continue;

				--col_cnt[i][board[cur.second][i]];

				if (col_cnt[i][board[cur.second][i]] == 0)
				{
					--col_sum[i];

					if (col_sum[i] == 1)
						q.push({ 1, i });
				}
			}
		}
		else
		{
			if (col_sum[cur.second] == 1)
			{
				col_sum[cur.second] == 0;

				for (int j = 0; j < 26; j++)
				{
					if (col_cnt[cur.second][j] > 0)
					{
						col_cnt[cur.second][j] = 0;
						res.push_back("K " + to_string(cur.second + 1) + " " + (char)('A' + j));
					}
				}
			}

			for (int i = 0; i < n; ++i)
			{
				if (row_sum[i] == 0)
					continue;

				--row_cnt[i][board[i][cur.second]];

				if (row_cnt[i][board[i][cur.second]] == 0)
				{
					--row_sum[i];

					if (row_sum[i] == 1)
						q.push({ 0, i });
				}
			}
		}
	}

	return res;
}

int main()
{
	int n, m;
	string s;
	cin >> n >> m;

	vector<vector<int>> board(n, vector<int>(m));
	vector<vector<int>> row_cnt(n, vector<int>(26));
	vector<vector<int>> col_cnt(m, vector<int>(26));
	vector<int> row_sum(n);
	vector<int> col_sum(m);

	for (int i = 0; i < n; ++i)
	{
		cin >> s;

		for (int j = 0; j < m; ++j)
		{
			board[i][j] = s[j] - 'A';

			++row_cnt[i][board[i][j]];
			++col_cnt[j][board[i][j]];
		}
	}

	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < 26; ++j)
		{
			if (row_cnt[i][j] > 0)
				++row_sum[i];
		}
	}

	for (int i = 0; i < m; ++i)
	{
		for (int j = 0; j < 26; ++j)
		{
			if (col_cnt[i][j] > 0)
				++col_sum[i];
		}
	}

	vector<string> res = solve(n, m, board, row_cnt, col_cnt, row_sum, col_sum);

	cout << res.size() << endl;

	for (int i = res.size() - 1; i >= 0; --i)
	{
		cout << res[i] << endl;
	}

	return 0;
}