#include <bits/stdc++.h>
using namespace std;
const int MAX=2005;
char tab[MAX][MAX];
int kolumny[MAX][27];
int rzedy[MAX][27];
int niezeror[MAX];
int niezerok[MAX];
queue <pair<char, int>> qu;
stack <pair<char, pair<int, char>>> ans;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >>n >>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin >>tab[i][j];
if(kolumny[j][tab[i][j]-'A'+1]==0) niezerok[j]++;
kolumny[j][tab[i][j]-'A'+1]++;
if(rzedy[i][tab[i][j]-'A'+1]==0) niezeror[i]++;
rzedy[i][tab[i][j]-'A'+1]++;
}
}
for(int i=1; i<=n; i++)
{
if(niezeror[i]==1) qu.push(make_pair('R', i));
}
for(int i=1; i<=m; i++)
{
if(niezerok[i]==1) qu.push(make_pair('K', i));
}
while(!qu.empty())
{
char a=qu.front().first, temp;
int x=qu.front().second;
qu.pop();
if(a=='K')
{
if(niezerok[x]==0) continue;
niezerok[x]=0;
for(int i=1; i<=n; i++)
{
if(tab[i][x]!='-')
{
temp=tab[i][x];
rzedy[i][tab[i][x]-'A'+1]--;
if(rzedy[i][tab[i][x]-'A'+1]==0) niezeror[i]--;
if(niezeror[i]==1)
{
qu.push(make_pair('R', i));
}
tab[i][x]='-';
}
}
ans.push(make_pair('K', make_pair(x, temp)));
}
else
{
if(niezeror[x]==0) continue;
niezeror[x]=0;
for(int i=1; i<=m; i++)
{
if(tab[x][i]!='-')
{
temp=tab[x][i];
kolumny[i][tab[x][i]-'A'+1]--;
if(kolumny[i][tab[x][i]-'A'+1]==0) niezerok[i]--;
if(niezerok[i]==1)
{
qu.push(make_pair('K', i));
}
tab[x][i]='-';
}
}
ans.push(make_pair('R', make_pair(x, temp)));
}
}
while(!qu.empty())
{
cout <<qu.front().first <<" " <<qu.front().second <<"\n";
qu.pop();
}
cout <<ans.size() <<"\n";
while(!ans.empty())
{
cout <<ans.top().first <<" " <<ans.top().second.first <<" " <<ans.top().second.second <<"\n";
ans.pop();
}
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; const int MAX=2005; char tab[MAX][MAX]; int kolumny[MAX][27]; int rzedy[MAX][27]; int niezeror[MAX]; int niezerok[MAX]; queue <pair<char, int>> qu; stack <pair<char, pair<int, char>>> ans; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >>n >>m; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin >>tab[i][j]; if(kolumny[j][tab[i][j]-'A'+1]==0) niezerok[j]++; kolumny[j][tab[i][j]-'A'+1]++; if(rzedy[i][tab[i][j]-'A'+1]==0) niezeror[i]++; rzedy[i][tab[i][j]-'A'+1]++; } } for(int i=1; i<=n; i++) { if(niezeror[i]==1) qu.push(make_pair('R', i)); } for(int i=1; i<=m; i++) { if(niezerok[i]==1) qu.push(make_pair('K', i)); } while(!qu.empty()) { char a=qu.front().first, temp; int x=qu.front().second; qu.pop(); if(a=='K') { if(niezerok[x]==0) continue; niezerok[x]=0; for(int i=1; i<=n; i++) { if(tab[i][x]!='-') { temp=tab[i][x]; rzedy[i][tab[i][x]-'A'+1]--; if(rzedy[i][tab[i][x]-'A'+1]==0) niezeror[i]--; if(niezeror[i]==1) { qu.push(make_pair('R', i)); } tab[i][x]='-'; } } ans.push(make_pair('K', make_pair(x, temp))); } else { if(niezeror[x]==0) continue; niezeror[x]=0; for(int i=1; i<=m; i++) { if(tab[x][i]!='-') { temp=tab[x][i]; kolumny[i][tab[x][i]-'A'+1]--; if(kolumny[i][tab[x][i]-'A'+1]==0) niezerok[i]--; if(niezerok[i]==1) { qu.push(make_pair('K', i)); } tab[x][i]='-'; } } ans.push(make_pair('R', make_pair(x, temp))); } } while(!qu.empty()) { cout <<qu.front().first <<" " <<qu.front().second <<"\n"; qu.pop(); } cout <<ans.size() <<"\n"; while(!ans.empty()) { cout <<ans.top().first <<" " <<ans.top().second.first <<" " <<ans.top().second.second <<"\n"; ans.pop(); } return 0; } |
English