#include #include #ifndef IO_HPP #define IO_HPP #include #include #include #include #include #include #include #include #include using namespace std; templateistream &operator>>(istream&,pair&); templateistream &operator>>(istream&,tuple&a); templateistream &operator>>(istream&is,vector&a); templateistream &operator>>(istream&is,array&a); template istream &operator>>(istream&is,pair&a){ is>>a.first>>a.second; return is; } template void read_tuple(istream&is,tuple&a){ if constexpr(pos>::value){ is>>get(a); read_tuple(is,a); } } template istream &operator>>(istream&is,tuple&a){ read_tuple<0>(is,a); return is; } template istream &operator>>(istream&is,vector&a){ for(T&x:a)is>>x; return is; } template istream &operator>>(istream&is,array&a){ for(T&x:a)is>>x; return is; } templateostream &operator<<(ostream&os,const pair&); templateostream &operator<<(ostream&os,const tuple&); templateostream &operator<<(ostream&os,const vector&); templateostream &operator<<(ostream&os,priority_queue); templateostream &operator<<(ostream&os,queue); templateostream &operator<<(ostream&os,deque); templateostream &operator<<(ostream&os,stack); templateostream &operator<<(ostream&os,const array&); templateostream &operator<<(ostream&os,const map&); templateostream &operator<<(ostream&os,const unordered_map&); templateostream &operator<<(ostream&os,const set&); templateostream &operator<<(ostream&os,const multiset&); templateostream &operator<<(ostream&os,const unordered_set&); template ostream &operator<<(ostream&os,const pair&a){ os< void write_tuple(ostream&os,const tuple&a){ if constexpr(pos>::value){ if constexpr(pos>0)os<<' '; os<(a); write_tuple(os,a); } } template ostream &operator<<(ostream&os,const tuple&a){ write_tuple<0>(os,a); return os; } template ostream &operator<<(ostream&os,const vector&a){ os<<'{'; for(int i=0;i<(int)a.size();i++){ os< ostream &operator<<(ostream&os,priority_queuea){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,queuea){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,dequea){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,stacka){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,const array&a){ os<<'{'; for(int i=0;i<(int)a.size();i++){ os< ostream &operator<<(ostream&os,const map&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<"{["<first<<","<second<<']'; while(++itr!=a.end())os<<",["<first<<','<second<<']'; os<<'}'; return os; } template ostream &operator<<(ostream&os,const unordered_map&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<"{["<first<<","<second<<']'; while(++itr!=a.end())os<<",["<first<<','<second<<']'; os<<'}'; return os; } template ostream &operator<<(ostream&os,const set&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<'{'<<*itr; while(++itr!=a.end())os<<','<<*itr; os<<'}'; return os; } template ostream &operator<<(ostream&os,const multiset&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<'{'<<*itr; while(++itr!=a.end())os<<','<<*itr; os<<'}'; return os; } template ostream &operator<<(ostream&os,const unordered_set&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<'{'<<*itr; while(++itr!=a.end())os<<','<<*itr; os<<'}'; return os; } #endif using namespace std; using ll=long long; using ull=unsigned long long; using P=pair; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templatevoid operator++(pair&a,int){a.first++,a.second++;} templatevoid operator--(pair&a,int){a.first--,a.second--;} templatevoid operator++(vector&a,int){for(auto &i:a)i++;} templatevoid operator--(vector&a,int){for(auto &i:a)i--;} using vref=typename vector::reference; vref operator|=(vref a,bool b){a=a|b;return a;} vref operator&=(vref a,bool b){a=a&b;return a;} vref operator^=(vref a,bool b){a=a^b;return a;} #define overload3(_1,_2,_3,name,...) name #define rep1(i,n) for(int i=0;i<(int)(n);i++) #define rep2(i,l,r) for(int i=(int)(l);i<(int)(r);i++) #define rep(...) overload3(__VA_ARGS__,rep2,rep1)(__VA_ARGS__) #define reps(i,l,r) rep2(i,l,r) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcountll(x) #define fin(x) return cout<<(x)<<'\n',static_cast(0) #define yn(x) cout<<((x)?"Yes\n":"No\n") #define uniq(x) sort(all(x)),x.erase(unique(all(x)),x.end()) template inline int fkey(vector&z,T key){return lower_bound(z.begin(),z.end(),key)-z.begin();} ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } #ifdef LOCAL #include #define SWITCH(a,b) (a) #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) #define SWITCH(a,b) (b) #endif struct Timer{ clock_t start; Timer(){ start=clock(); ios::sync_with_stdio(false); cin.tie(nullptr); cout<>testcase; for(int i=0;i #include struct has_update_impl{ template static auto check(T&&x)->decltype(x.update(),std::true_type{}); template static auto check(...)->std::false_type; }; template struct has_update:public decltype(has_update_impl::check(std::declval())){}; template inline constexpr bool has_update_v=has_update::value; struct has_push_impl{ template static auto check(T&&x)->decltype(x.push(),std::true_type{}); template static auto check(...)->std::false_type; }; template struct has_push:public decltype(has_push_impl::check(std::declval())){}; template inline constexpr bool has_push_v=has_push::value; struct has_middle_impl{ template static auto check(T&&x)->decltype(x.middle,std::true_type{}); template static auto check(...)->std::false_type; }; template struct has_middle:public decltype(has_middle_impl::check(std::declval())){}; template inline constexpr bool has_middle_v=has_middle::value; template concept can_copy_monoid=requires(T x){ x.copy_monoid(std::declval()); }; template void splay(T*nd){ if constexpr(has_push_v&&!no_push)nd->push(); while(nd->par){ T *p=nd->par; T *pp=p->par; if constexpr(has_push_v&&!no_push){ if(pp)pp->push(); p->push(); nd->push(); } if(p->left==nd){ if(pp){ if(pp->left==p){ nd->par=pp->par; if(pp->par){ if constexpr(has_middle_v){ if(pp->par->middle==pp)nd->par->middle=nd; else if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } else{ if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } } pp->left=p->right; if(pp->left)pp->left->par=pp; p->left=nd->right; if(p->left)p->left->par=p; nd->right=p; p->par=nd; p->right=pp; pp->par=p; if constexpr(has_update_v){ if constexpr(can_copy_monoid)nd->copy_monoid(pp),pp->update(),p->update(); else pp->update(),p->update(),nd->update(); } continue; } else if(pp->right==p){ nd->par=pp->par; if(pp->par){ if constexpr(has_middle_v){ if(pp->par->middle==pp)nd->par->middle=nd; else if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } else{ if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } } p->left=nd->right; if(p->left)p->left->par=p; pp->right=nd->left; if(pp->right)pp->right->par=pp; nd->left=pp; pp->par=nd; nd->right=p; p->par=nd; if constexpr(has_update_v){ if constexpr(can_copy_monoid)nd->copy_monoid(pp),pp->update(),p->update(); else pp->update(),p->update(),nd->update(); } continue; } } nd->par=pp; if(pp){ if constexpr(has_middle_v){ if(pp->middle==p)pp->middle=nd; else if(pp->left==p)pp->left=nd; else if(pp->right==p)pp->right=nd; } else{ if(pp->left==p)pp->left=nd; else if(pp->right==p)pp->right=nd; } } p->left=nd->right; if(p->left)p->left->par=p; nd->right=p; p->par=nd; if constexpr(has_update_v){ if constexpr(can_copy_monoid)nd->copy_monoid(p),p->update(); else p->update(),nd->update(); } break; } else if(p->right==nd){ if(pp){ if(pp->left==p){ nd->par=pp->par; if(pp->par){ if constexpr(has_middle_v){ if(pp->par->middle==pp)nd->par->middle=nd; else if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } else{ if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } } p->right=nd->left; if(p->right)p->right->par=p; pp->left=nd->right; if(pp->left)pp->left->par=pp; nd->left=p; p->par=nd; nd->right=pp; pp->par=nd; if constexpr(has_update_v){ if constexpr(can_copy_monoid)nd->copy_monoid(pp),pp->update(),p->update(); else pp->update(),p->update(),nd->update(); } continue; } else if(pp->right==p){ nd->par=pp->par; if(pp->par){ if constexpr(has_middle_v){ if(pp->par->middle==pp)nd->par->middle=nd; else if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } else{ if(pp->par->left==pp)nd->par->left=nd; else if(pp->par->right==pp)nd->par->right=nd; } } pp->right=p->left; if(pp->right)pp->right->par=pp; p->right=nd->left; if(p->right)p->right->par=p; nd->left=p; p->par=nd; p->left=pp; pp->par=p; if constexpr(has_update_v){ if constexpr(can_copy_monoid)nd->copy_monoid(pp),pp->update(),p->update(); else pp->update(),p->update(),nd->update(); } continue; } } nd->par=pp; if(pp){ if constexpr(has_middle_v){ if(pp->middle==p)pp->middle=nd; else if(pp->left==p)pp->left=nd; else if(pp->right==p)pp->right=nd; } else{ if(pp->left==p)pp->left=nd; else if(pp->right==p)pp->right=nd; } } p->right=nd->left; if(p->right)p->right->par=p; nd->left=p; p->par=nd; if constexpr(has_update_v){ if constexpr(can_copy_monoid)nd->copy_monoid(p),p->update(); else p->update(),nd->update(); } break; } else break; } } template [[nodiscard]]T* near(T *nd,decltype(T::key)k){ while(true){ if(kkey){ if constexpr(has_push_v)nd->push(); if(nd->left)nd=nd->left; else{ splay(nd); return nd; } } else if(nd->key)nd->push(); if(nd->right)nd=nd->right; else{ splay(nd); return nd; } } else{ splay(nd); return nd; } } return nullptr; } template [[nodiscard]]T* get_k(T *nd,decltype(T::sz)k){ while(true){ if constexpr(has_push_v)nd->push(); decltype(T::sz) lsz=nd->left?nd->left->sz:0; if(lsz==k)break; else if(kleft; else{ nd=nd->right; k-=1+lsz; } } splay(nd); return nd; } template [[nodiscard]]T* merge(T* l,T *r){ if(!l)return r; if(!r)return l; while(r->left){ if constexpr(has_push_v)r->push(); r=r->left; } if constexpr(has_push_v)r->push(); splay(r); r->left=l; l->par=r; if constexpr(has_update_v)r->update(); return r; } template [[nodiscard]]T* left_most(T*nd){ T nil; T *rnd=&nil; while(nd->left){ if constexpr(has_push_v)nd->push(); T *c=nd->left; if(!c->left){ rnd->left=nd; if constexpr(has_update_v||correct_parent)nd->par=rnd; rnd=rnd->left; nd=c; } else{ if constexpr(has_push_v)c->push(); nd->left=c->right; c->right=nd; if constexpr(has_update_v||correct_parent){ if(nd->left)nd->left->par=nd; nd->par=c; } if constexpr(has_update_v)nd->update(); if constexpr(has_update_v||correct_parent)c->par=rnd; rnd->left=c; nd=c->left; rnd=rnd->left; } } if constexpr(has_push_v)nd->push(); rnd->left=nd->right; nd->right=nil.left; if constexpr(has_update_v||correct_parent){ if(rnd->left)rnd->left->par=rnd; if(nd->right)nd->right->par=nd; nd->par=nullptr; } if constexpr(has_update_v){ if(rnd!=&nil){ while(rnd){ rnd->update(); rnd=rnd->par; } } } nil.left=nil.right=nullptr; return nd; } template [[nodiscard]]T* right_most(T*nd){ T nil; T *lnd=&nil; while(nd->right){ if constexpr(has_push_v)nd->push(); T *c=nd->right; if(!c->right){ lnd->right=nd; if constexpr(has_update_v||correct_parent)nd->par=lnd; lnd=lnd->right; nd=c; } else{ if constexpr(has_push_v)c->push(); nd->right=c->left; c->left=nd; if constexpr(has_update_v||correct_parent){ if(nd->right)nd->right->par=nd; nd->par=c; } if constexpr(has_update_v){ nd->update(); } if constexpr(has_update_v||correct_parent)c->par=lnd; lnd->right=c; nd=c->right; lnd=lnd->right; } } if constexpr(has_push_v)nd->push(); lnd->right=nd->left; nd->left=nil.right; if constexpr(has_update_v||correct_parent){ if(lnd->right)lnd->right->par=lnd; if(nd->left)nd->left->par=nd; nd->par=nullptr; } if constexpr(has_update_v){ if(lnd!=&nil){ while(lnd){ lnd->update(); lnd=lnd->par; } } } nil.left=nil.right=nullptr; return nd; } struct node; struct S{ int mneven,mnodd; int eid,oid; int sz; S(){} S(int x):mneven(x),mnodd(1e9),eid(0),oid(-1),sz(1){} }; S op(S x,S y){ S res=x; res.sz+=y.sz; if(x.sz%2==1)swap(y.mneven,y.mnodd),swap(y.eid,y.oid); if(chmin(res.mneven,y.mneven))res.eid=x.sz+y.eid; if(chmin(res.mnodd,y.mnodd))res.oid=x.sz+y.oid; return res; } struct node{ node *left=nullptr,*right=nullptr,*par=nullptr; S val; S mn; void update(){ mn=val; if(left)mn=op(left->mn,mn); if(right)mn=op(mn,right->mn); } }; pairsplit(node *nd,int k){ if(k==nd->mn.sz)return {nd,nullptr}; if(k==0)return {nullptr,nd}; while(true){ int lsz=nd->left?nd->left->mn.sz:0; if(kleft; else if(k==lsz)break; else nd=nd->right,k-=lsz+1; } splay(nd); node *lnd=nd->left; lnd->par=nd->left=nullptr; nd->update(); return {lnd,nd}; } string yaru(string s){ debug(s); int n=s.size(); vectornds(n); rep(i,n){ nds[i].val=S(s[i]-'a'); nds[i].update(); } node *root=nullptr; rep(i,n)root=merge(root,&nds[i]); string res; rep(i,n-3){ int id=root->mn.eid; debug(i,id); if(id+1==root->mn.sz){ auto [lnd,rnd]=split(root,root->mn.sz-4); auto [lnd2,rnd2]=split(rnd,2); root=merge(lnd,merge(rnd2,lnd2)); id-=2; } auto [lnd,rnd]=split(root,id); auto [lnd2,rnd2]=split(rnd,2); root=merge(lnd2,merge(lnd,rnd2)); auto [lnd3,rnd3]=split(root,1); res+='a'+lnd3->val.mneven; root=rnd3; } while(root){ auto [lnd4,rnd4]=split(root,1); res+='a'+lnd4->val.mneven; root=rnd4; } bool ok=false; rep(i,n-2)ok|=res[i]==res[i+2]; if(n>=5)ok|=res[n-5]==res[n-1]; if(ok&&res[n-3]>res[n-1])swap(res[n-3],res[n-1]); debug(res); return res; } void SOLVE(){ string s,t; cin>>s>>t; yn(yaru(s)==yaru(t)); // debug(s,yaru(s)); // debug(t,yaru(t)); }