#include #include int main() { int n; std::cin >> n; std::string courses, teachers; std::cin >> courses >> teachers; std::vector hm, hc; std::vector mc, cm; std::vector mh, ch; auto rem = [&]() { return hm.size() + hc.size() + mc.size() + cm.size() + mh.size() + ch.size(); }; for (int i = 0; i < n; i++) { auto a = courses[i]; auto b = teachers[i]; if (a == '-' && b == 'C') hc.push_back(i); if (a == '-' && b == 'M') hm.push_back(i); if (a == 'M' && b == 'C') mc.push_back(i); if (a == 'C' && b == 'M') cm.push_back(i); if (a == 'M' && b == '-') mh.push_back(i); if (a == 'C' && b == '-') ch.push_back(i); } struct Move { int type; int pos; }; auto moves = std::vector{}; while (rem() > 0) { char doing = 0; if (hm.size()) { doing = 'M'; auto i = hm.back(); hm.pop_back(); moves.push_back({0, i}); } else if (hc.size()) { doing = 'C'; auto i = hc.back(); hc.pop_back(); moves.push_back({0, i}); } else { throw std::runtime_error{"shouldnt happen"}; } auto use = [&](auto &&it) { auto j = it.back(); it.pop_back(); moves.push_back({1, 0}); moves.push_back({0, j}); moves.push_back({2, 0}); }; while (true) { if (doing == 'M') { if (mc.size()) { use(mc); doing = 'C'; } else if (mh.size()) { use(mh); break; } else { // fine we'll leave them here break; } } else { if (cm.size()) { use(cm); doing = 'M'; } else if (ch.size()) { use(ch); break; } else { break; } } } } std::cout << moves.size() << "\n"; for (auto move : moves) { if (move.type == 0) { std::cout << "DRIVE " << move.pos + 1 << '\n'; } else if (move.type == 1) { std::cout << "PICKUP\n"; } else { std::cout << "DROPOFF\n"; } } }