#pragma GCC optimize "O3" #include using namespace std; using LL=long long; #define FOR(i,l,r) for(int i=(l);i<=(r);++i) #define REP(i,n) FOR(i,0,(n)-1) #define ssize(x) int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pairp){return o<<"("<decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<sync_with_stdio(0); int n; cin >> n; vector is(n), should(n); REP(i, n) { char x; cin >> x; if (x == '-') should[i] = 0; else if (x == 'C') should[i] = 1; else if (x == 'M') should[i] = 2; else assert(false); } REP(i, n) { char x; cin >> x; if (x == '-') is[i] = 0; else if (x == 'C') is[i] = 1; else if (x == 'M') is[i] = 2; else assert(false); } debug(n, is, should); vector v(3, vector (3, vector{})); REP(i, n) { v[is[i]][should[i]].emplace_back(i); } debug(v); vector> ans; int have = 0; while (true) { if (have == 0) { if (ssize(v[1][0])) { auto x = v[1][0].back(); v[1][0].pop_back(); ans.emplace_back(0, x); ans.emplace_back(1, 0); have = 1; } else if (ssize(v[2][0])) { auto x = v[2][0].back(); v[2][0].pop_back(); ans.emplace_back(0, x); ans.emplace_back(1, 0); have = 2; } else { break; } } else if (have == 1) { if (ssize(v[2][1])) { auto x = v[2][1].back(); v[2][1].pop_back(); ans.emplace_back(0, x); ans.emplace_back(2, 0); ans.emplace_back(1, 0); have = 2; } else if (ssize(v[0][1])) { auto x = v[0][1].back(); v[0][1].pop_back(); ans.emplace_back(0, x); ans.emplace_back(2, 0); have = 0; } else { ans.pop_back(); have = 0; } } else if (have == 2) { if (ssize(v[1][2])) { auto x = v[1][2].back(); v[1][2].pop_back(); ans.emplace_back(0, x); ans.emplace_back(2, 0); ans.emplace_back(1, 0); have = 1; } else if (ssize(v[0][2])) { auto x = v[0][2].back(); v[0][2].pop_back(); ans.emplace_back(0, x); ans.emplace_back(2, 0); have = 0; } else { ans.pop_back(); have = 0; } } else { assert(false); } } debug(v); cout << ssize(ans) << '\n'; for (auto [type, x] : ans) { if (type == 0) { cout << "DRIVE " << x + 1 << '\n'; } else if (type == 1) { cout << "PICKUP\n"; } else if (type == 2) { cout << "DROPOFF\n"; } else assert(false); } }