#include using namespace std; typedef long long ll; constexpr int OPPICK = 5000; constexpr int OPDROP = 5001; int N; string lessons, professors; vector cm, mc; vector dm, md; vector dc, cd; struct viter { int pos, rem; const int *data; char first, second; viter(const vector &v, char f, char s) { pos = 0; rem = v.size(); data = v.data(); first = f; second = s; } int value() const { return data[pos]; } void next() { pos++; rem--; } /* void debug() { cerr << "D: " << first << second << ": "; for(int i=pos; i ans; bool check(viter mc, viter cm, viter dm, viter dc, viter md, viter cd) { char carico = '-'; const auto visit = [&carico](viter &v) { // cerr << "visit: " << v.value() << " e il carico e " << carico << '\n'; ans.push_back(drive(v.value())); v.next(); if (carico != '-') { assert(v.first == '-' || carico == v.first); ans.push_back(dropoff()); carico = '-'; } if (v.second != '-') { ans.push_back(pickup()); carico = v.second; cerr << "carico e " << carico << '\n'; } }; if(dm.rem <= 0) return false; visit(dm); while(mc.rem > 0 && cm.rem > 0) { visit(mc); visit(cm); } // cm è finito if (cm.rem <= 0) { while(mc.rem > 0) { visit(mc); if(mc.rem == 0) break; if(cd.rem > 0) visit(cd); if(dm.rem <= 0) return false; visit(dm); } } // mc è finito if (mc.rem <= 0) { while(cm.rem > 0) { if(md.rem > 0) visit(md); if(dc.rem <= 0) return false; visit(dc); visit(cm); } } if(carico == 'M' && md.rem > 0) visit(md); if(carico == 'C' && cd.rem > 0) visit(cd); while(md.rem > 0) { if(dm.rem <= 0) return false; visit(dm); visit(md); } while(cd.rem > 0) { if(dc.rem <= 0) return false; visit(dc); visit(cd); } assert(mc.rem == 0 && cm.rem == 0 && md.rem == 0 && cd.rem == 0); return true; } void print_ans() { cout << ans.size() << '\n'; for(const int a: ans) { if(a == OPPICK) cout << "PICKUP\n"; else if(a == OPDROP) cout << "DROPOFF\n"; else cout << "DRIVE " << a+1 << '\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> N >> lessons >> professors; for(int i=0; i