#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()) #define debug(X...)cerr<<"["#X"]: ", [](auto...$){((cerr<<$<<"; "),...)<p) { return o << "(" << p.first << ", " << p.second << ")"; } auto operator<<(auto&o, auto x)->decltype(x.end(),o){ o<<"{";int i=0;for(auto e:x)o<<", "+!i++<> N; vector> v(N); for(int i = 0; i < N; i++) { char c; cin >> c; v[i].second = c; } for(int i = 0; i < N; i++) { char c; cin >> c; v[i].first = c; } vector chcePusty, CdoM, MdoC, chceM, chceC, nicNaNic; for(int i = 0; i < N; i++) { if(v[i].first != '-' && v[i].second == '-') chcePusty.push_back(i); if(v[i].first == 'M' && v[i].second == 'C') CdoM.push_back(i); if(v[i].first == 'C' && v[i].second == 'M') MdoC.push_back(i); if(v[i].first == '-' && v[i].second == 'C') chceC.push_back(i); if(v[i].first == '-' && v[i].second == 'M') chceM.push_back(i); if(v[i].first == '-' && v[i].second == '-') nicNaNic.push_back(i); } //debug(CdoM); int chcePustyI = 0, CdoMI = 0, MdoCI = 0, chceMI = 0, chceCI = 0, nicNaNicI = 0; int current = 0; queue odp; while (CdoMI < CdoM.size() || MdoCI < MdoC.size() || chceMI < chceM.size() || chceCI < chceC.size()) { // take chcePusty if(chcePustyI == chcePusty.size()) { break; } odp.push("DRIVE " + to_string(chcePusty[chcePustyI] + 1) + '\n'); odp.push("PICKUP\n"); char motor = v[chcePusty[chcePustyI]].first; chcePustyI++; //debug(motor); // swap a guy bool swapsAvailable = true; while(swapsAvailable) { if(motor == 'C') { // look for CdoM if(CdoMI != CdoM.size()) { // dropoff guy and swap motor odp.push("DRIVE " + to_string(CdoM[CdoMI++] + 1) + '\n'); odp.push("DROPOFF\n"); if (chceMI != chceM.size()) { odp.push("PICKUP\n"); motor = 'M'; } else { motor = '-'; break; } } else swapsAvailable = false; } else { // look for MdoC if(MdoCI != MdoC.size()) { // dropoff guy and swap motor odp.push("DRIVE " + to_string(MdoC[MdoCI++] + 1) + '\n'); odp.push("DROPOFF\n"); if (chceCI != chceC.size()) { odp.push("PICKUP\n"); motor = 'C'; } else { motor = '-'; break; } } else swapsAvailable = false; } } if (motor == '-') continue; // drop off at end M or C bool leftAnywhere = false; if(motor == 'M') { if(chceMI != chceM.size()) { odp.push("DRIVE " + to_string(chceM[chceMI++] + 1) + '\n'); odp.push("DROPOFF\n"); } else { leftAnywhere = true; } } else { if(chceCI != chceC.size()) { odp.push("DRIVE " + to_string(chceC[chceCI++] + 1) + '\n'); odp.push("DROPOFF\n"); } else { leftAnywhere = true; } } if (leftAnywhere) { if(nicNaNicI != nicNaNic.size()) { odp.push("DRIVE " + to_string(nicNaNic[nicNaNicI++] + 1) + '\n'); odp.push("DROPOFF\n"); } else { break; } } } if(CdoMI == CdoM.size() && MdoCI == MdoC.size() && chceMI == chceM.size() && chceCI == chceC.size()) { cout << odp.size() << endl; while(!odp.empty()) { cout << odp.front(); odp.pop(); } } else { cout << "0" << endl; } }