#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> paths[6]; for(int i=0;i need={-1,-1}; while(sz(free[2])&&sz(free[3])){ int a=bc(2),b=bc(3); if(sz(paths[2])){ paths[2][0].pb(b); paths[2][0].pb(a); continue; } if(sz(paths[3])){ paths[3][0].pb(a); paths[3][0].pb(b); continue; } if(sz(free[2])){ int x=bc(2); paths[2].pb({a,b,x}); continue; } if(sz(free[3])){ int x=bc(3); paths[3].pb({b,a,x}); continue; } need={a,b}; } for(auto p:free[2])paths[2].pb({p}); for(auto p:free[3])paths[3].pb({p}); while(sz(free[4])){ paths[2].pb({bc(4)}); } while(sz(free[5])){ paths[3].pb({bc(5)}); } for(auto &p:paths[2]){ assert(sz(free[0])); p.pb(bc(0)); } for(auto &p:paths[3]){ assert(sz(free[1])); p.pb(bc(1)); } if(need.f!=-1){ assert(sz(free[0])||sz(free[1])); if(sz(free[0])){ paths[3].pb({need.f,need.s,bc(0)}); } else{ paths[2].pb({need.f,need.s,bc(0)}); } } vector> ops; bool carry=0; for(auto p:paths[2]){ 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}); } } } for(auto p:paths[3]){ 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"); } }