#include using namespace std; void even_out(vector>>& edges) { int c_in = edges[0][2].size() + edges[1][2].size(); int c_out = edges[2][0].size() + edges[2][1].size(); assert(c_in >= c_out); for (; c_out < c_in; c_out++) { edges[2][0].push_back(-1); } int b_in = edges[1][0].size() + edges[1][2].size(); int b_out = edges[0][1].size() + edges[2][1].size(); assert(b_in >= b_out); for (; b_out < b_in; b_out++) { edges[1][0].push_back(-1); } } bool solved(auto& edges) { int sum = edges[1][0].size() + edges[1][2].size() + edges[2][0].size() + edges[2][1].size(); return (sum == 0); } void euler(int node, vector>>& edges, vector& walk) { // cerr << node << endl; for (int i = 2; i >= 0; i--) { while(!edges[node][i].empty()) { int edge = edges[node][i].back(); edges[node][i].pop_back(); euler(i, edges, walk); walk.push_back(edge); } } } string itoa(int i) { string s; do { s += (i % 10 + '0'); i /= 10; } while (i > 0); reverse(s.begin(), s.end()); return s; } void Solve() { map mp; mp['-'] = 0; mp['M'] = 1; mp['C'] = 2; int n; cin >> n; string bui; cin >> bui; string prof; cin >> prof; vector>> edges(3, vector>(3)); for (int i = 0; i < n; i++) { edges[mp[bui[i]]][mp[prof[i]]].push_back(i); } for (int i = 0; i < 3; i++) { edges[i][i].clear(); } // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 3; j++) { // cerr << edges[i][j].size() << " "; // } // cerr << endl; // } if (solved(edges)) { cout << "0\n"; return; } even_out(edges); vector walk; euler(0, edges, walk); reverse(walk.begin(), walk.end()); // for (auto& i : walk) { // cerr << i << " "; // } // cerr << endl; vector ans; bool on = false; for (auto& i : walk) { if (i == -1) { continue; } ans.push_back("DRIVE " + itoa(i + 1)); if (on) { ans.push_back("DROPOFF"); on = false; } if (prof[i] != '-') { ans.push_back("PICKUP"); on = true; } } cout << ans.size() << "\n"; for (auto& line : ans) { cout << line << "\n"; } } int main() { Solve(); }