#include using namespace std; using ll = long long; array, 3> tp = {{ {-1, 4, 1}, {3, -1, 2}, {5, 6, -1} }}; vector> building(7, vector()); stringstream ss; int instr = 0; int stop = -1; bool passenger = false; void drive(int t){ ss << "DRIVE " << building[t].back() << "\n"; // printf("DRIVE %d\n", building[t].back()); building[t].pop_back(); stop = t; instr++; } void pickup(){ // printf("PICKUP\n"); ss << "PICKUP"<< "\n"; assert(!passenger); passenger = true; instr++; } void dropoff(){ // printf("DROPOFF\n"); ss << "DROPOFF"<< "\n"; assert(passenger); passenger = false; instr++; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; string clas; cin >> clas; string prof; cin >> prof; //cout << "lol " << " " << clas.size() << " " << prof.size() << endl; for(int i = 0; i < n; ++i) { int a = -1, b = -1; if(prof[i] == 'M'){ a = 0; }else if(prof[i] == 'C'){ a = 1; }else if(prof[i] == '-'){ a = 2; } if(clas[i] == 'M'){ b = 0; }else if(clas[i] == 'C'){ b = 1; }else if(clas[i] == '-'){ b = 2; } //cout << a << " " << b << endl; if(tp[a][b] == -1) continue; building[tp[a][b]].push_back(i + 1); } if(building[6].size() >= building[5].size()){ while(building[1].size() > 0 && (building[3].size() > 0 || building[5].size() > 0)){ drive(1); if(passenger) dropoff(); pickup(); while(building[3].size() > 0){ drive(3); dropoff(); pickup(); if(building[4].size() > 0){ drive(4); dropoff(); pickup(); } } if(stop == 1 || stop == 4){ if(building[5].size() > 0){ drive(5); dropoff(); } }else if(stop == 3){ if(building[6].size() > 0){ drive(6); dropoff(); } } } while(building[2].size() > 0 && (building[4].size() > 0 || building[6].size() > 0)){ drive(2); if(passenger) dropoff(); pickup(); if(building[4].size() > 0){ drive(4); dropoff(); if(building[5].size() > 0){ pickup(); drive(5); dropoff(); pickup(); } }else if(building[6].size() > 0){ drive(6); dropoff(); } } while(building[1].size() > 0 && building[5].size() > 0){ drive(1); if(passenger) dropoff(); pickup(); drive(5); dropoff(); } }else{ while(building[2].size() > 0 && (building[4].size() > 0 || building[6].size() > 0)){ drive(2); if(passenger) dropoff(); pickup(); while(building[4].size() > 0){ drive(4); dropoff(); pickup(); if(building[3].size() > 0){ drive(3); dropoff(); pickup(); } } if(stop == 2 || stop == 3){ if(building[6].size() > 0){ drive(6); dropoff(); } }else if(stop == 4){ if(building[5].size() > 0){ drive(5); dropoff(); } } } while(building[1].size() > 0 && (building[3].size() > 0 || building[5].size() > 0)){ drive(1); if(passenger) dropoff(); pickup(); if(building[3].size() > 0){ drive(3); dropoff(); if(building[6].size() > 0){ pickup(); drive(6); dropoff(); pickup(); } }else if(building[5].size() > 0){ drive(5); dropoff(); } } while(building[2].size() > 0 && building[6].size() > 0){ drive(2); if(passenger) dropoff(); pickup(); drive(6); dropoff(); } } if(passenger) dropoff(); cout << instr << "\n"; cout << ss.str(); }