#include using namespace std; using vi = vector; using vvi = vector; using ll = long long; using vll = vector; using vvll = vector; int pop(vi &v) { assert(v.size() > 0); int x = v[v.size()-1]; v.pop_back(); return x; } string DRIVE(int x) { return "DRIVE " + to_string(x+1); } // -m+c first bool try1(int n, string fin, string init) { vi mcpm, mmpc, pc, mc, pm, mm; for(int i = 0; i < n; i++) { if(init[i] == 'M' && fin[i] == 'C') { mmpc.push_back(i); } if(init[i] == 'C' && fin[i] == 'M') { mcpm.push_back(i); } if(init[i] == '-' && fin[i] == 'C') { pc.push_back(i); } if(init[i] == '-' && fin[i] == 'M') { pm.push_back(i); } if(init[i] == 'C' && fin[i] == '-') { mc.push_back(i); } if(init[i] == 'M' && fin[i] == '-') { mm.push_back(i); } } // cerr << mmpc.size() << ' ' << mcpm.size() << ' ' << pc.size() << ' ' << pm.size() << ' ' << mc.size() << ' ' << mm.size() << endl; if(mmpc.size() < mcpm.size()) { return false; } vector ans; if(mmpc.size() > 0) { if(mc.empty()) { return false; } int s = pop(mc); ans.push_back(DRIVE(s)); ans.push_back("PICKUP"); while(!mcpm.empty()) { int a = pop(mmpc); ans.push_back(DRIVE(a)); ans.push_back("DROPOFF"); ans.push_back("PICKUP"); int b = pop(mcpm); ans.push_back(DRIVE(b)); ans.push_back("DROPOFF"); if(mmpc.size() > 0 || pc.size() > 0) { ans.push_back("PICKUP"); } } if(mmpc.size() > 0) { int a = pop(mmpc); ans.push_back(DRIVE(a)); ans.push_back("DROPOFF"); if(pm.size() > 0){ ans.push_back("PICKUP"); int c = pop(pm); ans.push_back(DRIVE(c)); ans.push_back("DROPOFF"); } } else { if(pc.size() > 0) { int c = pop(pc); ans.push_back(DRIVE(c)); ans.push_back("DROPOFF"); } } } assert(mcpm.empty()); // resolve while(!mmpc.empty()) { if(mc.empty()) { return false; } int a = pop(mc); int b = pop(mmpc); ans.push_back(DRIVE(a)); ans.push_back("PICKUP"); ans.push_back(DRIVE(b)); ans.push_back("DROPOFF"); if(pm.size() > 0) { ans.push_back("PICKUP"); int c = pop(pm); ans.push_back(DRIVE(c)); ans.push_back("DROPOFF"); } } while(!pc.empty()) { if(mc.empty()) { return false; } int a = pop(mc); int b = pop(pc); ans.push_back(DRIVE(a)); ans.push_back("PICKUP"); ans.push_back(DRIVE(b)); ans.push_back("DROPOFF"); } while(!pm.empty()) { if(mm.empty()) { return false; } int a = pop(mm); int b = pop(pm); ans.push_back(DRIVE(a)); ans.push_back("PICKUP"); ans.push_back(DRIVE(b)); ans.push_back("DROPOFF"); } cout << ans.size() << endl; for(string s : ans) { cout << s << endl; } exit(0); } void solve() { int n; string fin; string init; cin >> n >> fin >> init; try1(n, fin, init); for(int i = 0; i < n; i++) { if(fin[i] == 'C') { fin[i] = 'M'; } else if(fin[i] == 'M') { fin[i] = 'C'; } if(init[i] == 'C') { init[i] = 'M'; } else if(init[i] == 'M') { init[i] = 'C'; } } try1(n, fin, init); } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); solve(); }