#include #define pb push_back #define sz(x) (int)(x).size() #define f first #define s second #define ll long long using namespace std; int main(){ int n; scanf("%i",&n); string a,b; cin >> a >> b; vector free[6]; vector bf[6]; vector type(n); for(int i=0;i path; vector> paths; if(k!=-1){ if(o){ if(sz(free[2])==0)break; path.pb(bc(2)); bool bad=0; for(int i=0;i x; x.pb(bc(4)); for(auto p:path)x.pb(p); path=x; } else paths.pb({bc(4)}); } } while(sz(free[3])){ paths.pb({bc(3)}); } while(sz(free[5])){ if(sz(free[2])){ paths.pb({bc(5),bc(2)}); } else{ if(sz(path)&&type[path[0]]==2){ vector x; x.pb(bc(5)); for(auto p:path)x.pb(p); path=x; } else paths.pb({bc(5)}); } } while(sz(free[2])){ paths.pb({bc(2)}); } if(sz(path)) paths.pb(path); bool ok=1; for(auto &p:paths){ if(type[p.back()]==2||type[p.back()]==4){ if(sz(free[0])==0){ ok=0; break; } p.pb(bc(0)); } else{ if(sz(free[1])==0){ ok=0; break; } p.pb(bc(1)); } } if(!ok)continue; vector> ops; bool carry=0; for(auto p:paths){ reverse(p.begin(),p.end()); for(auto d:p){ ops.pb({0,d+1}); if(carry){ ops.pb({1,0}); } if(b[d]=='-'){ carry=0; } else{ carry=1; ops.pb({2,0}); } } } if(sz(ops)&&ops.back().f==2)ops.pop_back(); printf("%i\n",sz(ops)); for(auto p:ops){ if(p.f==0){ printf("DRIVE %i\n",p.s); } if(p.f==1)printf("DROPOFF\n"); if(p.f==2)printf("PICKUP\n"); } return 0; }} }