#include //#pragma GCC optimize("O3") //#define int long long using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; vector > Ans; vector svs[10]; /* 0 M C 1 C M 2 - C 3 - M 4 C - 5 M - */ void goCycle(int start) { // Starts at state "start" for (int id = start;; id++) { if (id % 2 != 0) { if (!svs[0].empty()) { Ans.push_back({"PICKUP", -1}); Ans.push_back({"DRIVE", svs[0].back()}); Ans.push_back({"DROPOFF", -1}); svs[0].pop_back(); continue; } else if (!svs[5].empty()) { Ans.push_back({"PICKUP", -1}); Ans.push_back({"DRIVE", svs[5].back()}); Ans.push_back({"DROPOFF", -1}); svs[5].pop_back(); break; } else { break; } } else { if (!svs[1].empty()) { Ans.push_back({"PICKUP", -1}); Ans.push_back({"DRIVE", svs[1].back()}); Ans.push_back({"DROPOFF", -1}); svs[1].pop_back(); continue; } else if (!svs[4].empty()) { Ans.push_back({"PICKUP", -1}); Ans.push_back({"DRIVE", svs[4].back()}); Ans.push_back({"DROPOFF", -1}); svs[4].pop_back(); break; } else { break; } } } } string needs, profs; signed main(){ cin.tie(0); ios::sync_with_stdio(0); int n; cin >> n; cin >> needs; cin >> profs; for (int i = 0; i < n; i++) { if (needs[i] == 'M' && profs[i] == 'C')svs[0].push_back(i + 1); else if (needs[i] == 'C' && profs[i] == 'M')svs[1].push_back(i + 1); else if (needs[i] == '-' && profs[i] == 'C')svs[2].push_back(i + 1); else if (needs[i] == '-' && profs[i] == 'M')svs[3].push_back(i + 1); else if (needs[i] == 'C' && profs[i] == '-')svs[4].push_back(i + 1); else if (needs[i] == 'M' && profs[i] == '-')svs[5].push_back(i + 1); } if (!svs[2].empty() && !svs[1].empty()) { Ans.push_back({"DRIVE", svs[2].back()}); Ans.push_back({"PICKUP", -1}); svs[2].pop_back(); Ans.push_back({"DRIVE", svs[1].back()}); Ans.push_back({"DROPOFF", -1}); svs[1].pop_back(); goCycle(1); } if (!svs[3].empty() && !svs[0].empty()) { Ans.push_back({"DRIVE", svs[3].back()}); Ans.push_back({"PICKUP", -1}); svs[3].pop_back(); Ans.push_back({"DRIVE", svs[0].back()}); Ans.push_back({"DROPOFF", -1}); svs[0].pop_back(); goCycle(0); } while (true) { if (svs[2].empty() || svs[4].empty())break; Ans.push_back({"DRIVE", svs[2].back()}); Ans.push_back({"PICKUP", -1}); svs[2].pop_back(); Ans.push_back({"DRIVE", svs[4].back()}); Ans.push_back({"DROPOFF", -1}); svs[4].pop_back(); } while (true) { if (svs[2].empty() || svs[1].empty())break; Ans.push_back({"DRIVE", svs[2].back()}); Ans.push_back({"PICKUP", -1}); svs[2].pop_back(); Ans.push_back({"DRIVE", svs[1].back()}); Ans.push_back({"DROPOFF", -1}); svs[1].pop_back(); } while (true) { if (svs[3].empty() || svs[5].empty())break; Ans.push_back({"DRIVE", svs[3].back()}); Ans.push_back({"PICKUP", -1}); svs[3].pop_back(); Ans.push_back({"DRIVE", svs[5].back()}); Ans.push_back({"DROPOFF", -1}); svs[5].pop_back(); } while (true) { if (svs[3].empty() || svs[0].empty())break; Ans.push_back({"DRIVE", svs[3].back()}); Ans.push_back({"PICKUP", -1}); svs[3].pop_back(); Ans.push_back({"DRIVE", svs[0].back()}); Ans.push_back({"DROPOFF", -1}); svs[0].pop_back(); } assert (svs[0].empty() && svs[1].empty() && svs[4].empty() && svs[5].empty()); cout << Ans.size() << '\n'; for (auto [i, j] : Ans) { cout << i; if (j != -1)cout << " " << j; cout << '\n'; } return 0; }