思路:维护一个单调栈,同时维护字符是否出现过和字符的剩余个数
链接:https://ac.nowcoder.com/acm/contest/551/D

// 
#include <bits/stdc++.h>
int vis[300];
using namespace std;
int main(){
    string s,res;
    cin >> s;
    unordered_map<int,int>cnt;
    for(auto c:s) cnt[c]++;
    for(int i=0;i<s.size();i++){
        cnt[s[i]]--;//处理当前只剩下这一个元素的情况
        if(!vis[s[i]]){
            while(res.size() && cnt[res.back()] && s[i] < res.back()){
                vis[res.back()] = 0;
                res.pop_back();
            }
            res.push_back(s[i]);
            vis[s[i]] = 1;
        }
    }
    cout << res << endl;
    return 0;
}