#include using namespace std; const int MAXN = 2010; int nas[MAXN], pro[MAXN], sled[MAXN], prvi[MAXN]; bool pos[MAXN]; vector > p, n; vector ciklusi; set boje[MAXN]; vector > sol; void dfs(int node, int idx) { pos[node] = true; boje[idx].insert(nas[node]); if (!pos[sled[node]]) dfs(sled[node], idx); } int zajBoja(set &a, set &b) { if (a.find(1) != a.end() && b.find(1) != b.end()) return 1; if (a.find(2) != a.end() && b.find(2) != b.end()) return 2; if (a.find(3) != a.end() && b.find(3) != b.end()) return 3; return -1; } int main() { ios::sync_with_stdio(false); int N; cin >> N; string nastava; cin >> nastava; string profesor; cin >> profesor; for (int i = 0; i < N; i++) { if (nastava[i] == 'C') { nas[i+1] = 1; } else if (nastava[i] == 'M') { nas[i+1] = 3; } else { nas[i+1] = 2; } n.push_back({nas[i+1], i+1}); } for (int i = 0; i < N; i++) { if (profesor[i] == 'C') { pro[i+1] = 1; } else if (profesor[i] == 'M') { pro[i+1] = 3; } else { pro[i+1] = 2; } p.push_back({pro[i+1], i+1}); } sort(p.begin(), p.end()); sort(n.begin(), n.end()); for (int i = 0; i < N; i++) { sled[p[i].second] = n[i].second; } int idx = 0; int poc = -1; for (int i = 1; i <= N; i++) { if (!pos[i]) { dfs(i, ++idx); if (boje[idx].size() > 1) { ciklusi.push_back(idx); poc = i; prvi[idx] = i; } } } if (poc == -1) { cout << 0 << endl; return 0; } for (int i = 1; i < ciklusi.size(); i++) { int idx1 = ciklusi[i-1], idx2 = ciklusi[i-2]; int boja = zajBoja(boje[idx1], boje[idx2]); int tren1 = prvi[idx1]; int tren2 = prvi[idx2]; while (nas[sled[tren1]] != boja) { tren1 = sled[tren1]; } while (nas[sled[tren2]] != boja) { tren2 = sled[tren2]; } int sled1 = sled[tren1]; int sled2 = sled[tren2]; sled[tren1] = sled2; sled[tren2] = sled1; } for (int i = 1; i <= N; i++) { //cout << "UPAREN " << i << ' ' << sled[i] << endl; } while (nas[poc] != 2) { //cerr << poc << endl; poc = sled[poc]; } int tren = poc; int havePassenger = false; do { sol.push_back({"DRIVE", tren}); if (nas[tren] != 2 || havePassenger) { sol.push_back({"DROPOFF", -1}); havePassenger = 0; } if (pro[tren] != 2 && sled[tren] != poc) { sol.push_back({"PICKUP", -1}); havePassenger = 1; } tren = sled[tren]; } while (tren != poc); cout << sol.size() << '\n'; for (auto x : sol) { if (x.first == "DRIVE") { cout << "DRIVE " << x.second << '\n'; } else { cout << x.first << '\n'; } } return 0; }