#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,fma,abm,mmx,avx,avx2,tune=native")
#pragma GCC target("sse,sse2,abm,mmx,sse3,tune=native")
using namespace std;
typedef long long lld;
typedef pair<int, int> pii;
typedef pair<lld, lld> pll;
#define ff first
#define dd second
#define mp make_pair
#define pb push_back
#define sz size()
#define For(i, s, a) for(int i = s; i < a; ++i)
#define all(x) (x).begin(), (x).end()
#define make_unique(x) (x).erase(unique(all(x)), (x).end())
const int N = 2e3 + 1;
char s[N][N];
int ctx[128][N], cty[128][N], ilex[N], iley[N];
vector<tuple<char, int, char>> out;
bool checkdone(int n, int m) {
bool xd = 0;
For (i, 0, n)
xd |= ilex[i];
For (j, 0, m)
xd |= iley[j];
return !xd;
}
int simple(int n, int m, int x, int y) {
char z = 0;
const int xb = x == -1 ? 0 : x, xe = x == -1 ? n : x + 1;
const int yb = y == -1 ? 0 : y, ye = y == -1 ? m : y + 1;
For (i, xb, xe)
For (j, yb, ye) {
z = s[i][j] ? s[i][j] : z;
}
if (!z)
return 0;
bool ok = 1;
For (i, xb, xe)
For (j, yb, ye) {
ok &= (!s[i][j]) || (s[i][j] == z);
}
return ok ? z : -1;
}
int main(void) {
int n, m;
scanf("%d%d", &n, &m);
For (i, 0, n)
scanf("%s", s[i]);
For (i, 0, n)
For (j, 0, m)
ctx[s[i][j]][i]++,
cty[s[i][j]][j]++;
For (i, 0, n)
For (k, 0, 128)
ilex[i] += ctx[k][i] > 0;
For (j, 0, m)
For (k, 0, 128)
iley[j] += cty[k][j] > 0;
while (true) {
if (checkdone(n, m))
break;
For (i, 0, n)
if (ilex[i] == 1) {
char xd = 0;
For (k, 0, 128)
if (ctx[k][i]) {
xd = k;
break;
}
out.push_back({'R', i + 1, xd});
For (j, 0, m) {
cty[s[i][j]][j]--;
if (!cty[s[i][j]][j])
iley[j]--;
s[i][j] = 0;
}
ilex[i] = 0;
}
For (j, 0, m)
if (iley[j] == 1) {
char xd = 0;
For (k, 0, 128)
if (cty[k][j]) {
xd = k;
break;
}
out.push_back({'K', j + 1, xd});
For (i, 0, n) {
ctx[s[i][j]][i]--;
if (!ctx[s[i][j]][i])
ilex[i]--;
s[i][j] = 0;
}
iley[j] = 0;
}
}
reverse(all(out));
printf("%d\n", (int)out.size());
for (auto ss : out)
printf("%c %d %c\n", get<0>(ss), get<1>(ss), get<2>(ss));
}
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 | #include <bits/stdc++.h> #pragma GCC optimize("Ofast,unroll-loops") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,fma,abm,mmx,avx,avx2,tune=native") #pragma GCC target("sse,sse2,abm,mmx,sse3,tune=native") using namespace std; typedef long long lld; typedef pair<int, int> pii; typedef pair<lld, lld> pll; #define ff first #define dd second #define mp make_pair #define pb push_back #define sz size() #define For(i, s, a) for(int i = s; i < a; ++i) #define all(x) (x).begin(), (x).end() #define make_unique(x) (x).erase(unique(all(x)), (x).end()) const int N = 2e3 + 1; char s[N][N]; int ctx[128][N], cty[128][N], ilex[N], iley[N]; vector<tuple<char, int, char>> out; bool checkdone(int n, int m) { bool xd = 0; For (i, 0, n) xd |= ilex[i]; For (j, 0, m) xd |= iley[j]; return !xd; } int simple(int n, int m, int x, int y) { char z = 0; const int xb = x == -1 ? 0 : x, xe = x == -1 ? n : x + 1; const int yb = y == -1 ? 0 : y, ye = y == -1 ? m : y + 1; For (i, xb, xe) For (j, yb, ye) { z = s[i][j] ? s[i][j] : z; } if (!z) return 0; bool ok = 1; For (i, xb, xe) For (j, yb, ye) { ok &= (!s[i][j]) || (s[i][j] == z); } return ok ? z : -1; } int main(void) { int n, m; scanf("%d%d", &n, &m); For (i, 0, n) scanf("%s", s[i]); For (i, 0, n) For (j, 0, m) ctx[s[i][j]][i]++, cty[s[i][j]][j]++; For (i, 0, n) For (k, 0, 128) ilex[i] += ctx[k][i] > 0; For (j, 0, m) For (k, 0, 128) iley[j] += cty[k][j] > 0; while (true) { if (checkdone(n, m)) break; For (i, 0, n) if (ilex[i] == 1) { char xd = 0; For (k, 0, 128) if (ctx[k][i]) { xd = k; break; } out.push_back({'R', i + 1, xd}); For (j, 0, m) { cty[s[i][j]][j]--; if (!cty[s[i][j]][j]) iley[j]--; s[i][j] = 0; } ilex[i] = 0; } For (j, 0, m) if (iley[j] == 1) { char xd = 0; For (k, 0, 128) if (cty[k][j]) { xd = k; break; } out.push_back({'K', j + 1, xd}); For (i, 0, n) { ctx[s[i][j]][i]--; if (!ctx[s[i][j]][i]) ilex[i]--; s[i][j] = 0; } iley[j] = 0; } } reverse(all(out)); printf("%d\n", (int)out.size()); for (auto ss : out) printf("%c %d %c\n", get<0>(ss), get<1>(ss), get<2>(ss)); } |
English