#include using namespace std; using ll=long long; //#define int ll #define rep(i,a,b) for(int i=a;i<(b);i++) #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) using pii=pair; using vi=vector; #define fi first #define se second #define pb push_back int id(char c) { if(c == '-') return 0; if(c == 'C') return 1; if(c == 'M') return 2; assert(0); } vi eulerWalk(vector>&gr, int nedges,int src=0) { int n=sz(gr); vi D(n),its(n),eu(nedges),ret,s={src}; // D[src]++;// while(!s.empty()) { int x=s.back(),y,e,&it=its[x],end=sz(gr[x]); if(it==end) {ret.push_back(x); s.pop_back(); continue;} tie(y,e)=gr[x][it++]; if(!eu[e]){ D[x]--,D[y]++; eu[e]=1;s.push_back(y); } } for (int x:D) if(x<0||sz(ret)!=nedges+1) return {}; return {ret.rbegin(),ret.rend()}; } signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n; cin >> n; string S, P; // if(local) { //// for(auto i : S) // } else { cin >> S >> P; // } array, 3> cnt; vector>> edges(3, vector>(3)); vector> g(3); int s = 0; // int wantM = count(all(S), 'M'); // int wantC = count(all(S), 'C'); // for(auto &i : P) { // if(i == 'M') { // if(wantM) wantM--; // else i = '-'; // }//3 MC- CMM // if(i == 'C') { // if(wantC) wantC--; // else i = '-'; // } // } for(auto c : {'M', 'C'}) { // cout << c << endl; int want = 0; for(auto i : S) want -= i == c; for(auto i : P) want += i == c; for(int i = 0; i < n; i++) { if(S[i] == c && P[i] == c && want) { want--; P[i] = '-'; } } for(int i = 0; i < n; i++) { if(P[i] == c && want) { want--; P[i] = '-'; } } } // cout << S << " " << P << endl; for(auto &i : cnt) i.fill(0); int KIREKHAR = 0; for(int i = 0; i < n; i++) { int from = id(S[i]), to = id(P[i]); if(from != to) { cnt[from][to]++; edges[from][to].push_back(i); g[from].push_back({to, KIREKHAR++}); // s = from; } } vector> ops; auto get = [&](int u, int v) { cnt[u][v]--; int t = edges[u][v].back(); edges[u][v].pop_back(); return t; }; auto do_edge = [&](int x, int y) -> void { ops.push_back({"DRIVE", get(x, y)}); if(x) ops.push_back({"DROPOFF", 0}); if(y) ops.push_back({"PICKUP", 0}); }; auto ord = eulerWalk(g, KIREKHAR, 0); // cout << ord.size() << " " << KIREKHAR << endl; for(int i = 1; i <= KIREKHAR; i++) { do_edge(ord[i - 1], ord[i]); } for(auto &i : cnt) for(auto &j : i) assert(!j); cout << ops.size() << '\n'; for(auto [s, t] : ops) { cout << s; if(s == "DRIVE") { cout << " " << 1+t << '\n'; } else cout << '\n'; } }