Codeforces Round 910 E

发布时间 2023-11-21 22:53:48作者: ycllz

tilian
我们发现可以通过交换相邻两个的方式让字典序小的任意移动
我们目标串t
要是t[0]为 c 我们肯定是找到第一个合法的c的位置
每次去找合法并且最优的
那么哪些是不合法的呢 比如我 比c小的 a,b 位置还在第一个c前肯定就不能用了
我们用26个set维护这个过程即可

void solve() {
    int n,m;cin>>n>>m;
    string s,t;cin>>s>>t;
    set<int>st[26];
    for(int i=0;i<n;i++){
        st[s[i]-'a'].insert(i);
    }
    for(int i=0;i<m;i++){
        int now=t[i]-'a';
        if(st[now].size()){
            auto it=*st[now].begin();
            for(int j=0;j<=now;j++){
                while(st[j].size()&&*st[j].begin()<=it){
                    st[j].erase(st[j].begin());
                }
            }
        }else{ NO return;}
    }
    YES
}