#include #include #include #include #include #include #include #include #include #include using namespace std; #define for if(0);else for typedef string card; inline bool possible( const card& top, const card& c ) { return top[0]==c[0] || top[1]==c[1]; } inline card mediator( const card& a, const card& b ) { card s; s="ab"; if( b[0]=='7' || b[0]=='6' || b[0]=='A' ) { s[0] = b[0]; s[1]=a[1]; return s; } if( a[1] == b[1] ) { s[0] = '6'; s[1]=a[1]; return s; } if( a[0]=='7' || a[0]=='6' || a[0]=='A' ) { s[0] = a[0]; s[1]=b[1]; return s; } if( a[0]=='K' && b[1]=='S' ) { s = "KS"; return "KS"; } if( b[0]=='K' && a[1]=='S' ) { s = "KS"; return "KS"; } return ""; } bool dfs( const card& top, vector& skips, card* nsk, vector& stk ) { if( skips.empty() ) { if( nsk ) { if( !possible(top,*nsk) ) return false; if( (*nsk)[0]=='Q' ) stk.push_back( (*nsk)+"S" ); else stk.push_back( *nsk ); } cout << "YES" << endl; for(int i=0; i!=stk.size(); ++i) { if(i) cout << ' '; cout << stk[i]; } cout << endl; return true; } for(int i=0; i!=skips.size(); ++i) if( skips[i] == "*" ) { // joker card c = skips[i]; skips[i] = skips.back(); skips.pop_back(); { bool processed = false; for(int j=0; j!=skips.size(); ++j) if( skips[j]!="*" ) { processed = true; string inst = mediator(top, skips[j]); if( !inst.empty() ) { stk.push_back( "*"+inst ); if( dfs(inst,skips,nsk,stk) ) return true; stk.pop_back(); } } if( !processed ) if( nsk ) { string inst = mediator(top, *nsk); if( !inst.empty() ) { stk.push_back( "*"+inst ); if( dfs(inst,skips,nsk,stk) ) return true; stk.pop_back(); } } else { if( skips.size()==0 ) // last card - case { stk.push_back( "*"+top ); } else { stk.push_back( "*6"+top.substr(1,1) ); stk.push_back( "*6"+top.substr(1,1) ); } skips.clear(); dfs( top, skips, 0, stk ); return true; } } skips.push_back(skips[i]); skips[i] = c; } else if( possible(top, skips[i]) ) { // non-joker card c = skips[i]; stk.push_back(c); skips[i] = skips.back(); skips.pop_back(); if( dfs(c,skips,nsk,stk) ) return true; stk.pop_back(); skips.push_back(skips[i]); skips[i] = c; } return false; } int main() { vector ss; for(string s; cin>>s; ss.push_back(s)); card top = ss.back(); ss.pop_back(); if( top[0]=='*' ) top = top.substr(1); if( top[0]=='Q' ) top[1] = top[2], top = top.substr(0,2); vector skips; card* non_skip = 0; for(int i=0; i!=ss.size(); ++i) if( ss[i][0]=='6' || ss[i][0]=='7' || ss[i][0]=='A' || ss[i]=="KS" || ss[i]=="*" ) skips.push_back(ss[i]); else if( non_skip ) { cout<<"NO"< stk; dfs( top, skips, non_skip, stk ); return 0; }