cf题目链接
题意:给你一个字符串,问对所有重复字符删除至只剩一个后得到的字典序最大的字符串是什么
解析:简单的模拟,要使字典序最大,那么我们就要使前面的字符最大,要使大字符提前,那我们就需要尽量删去大字符之前的小字符,但删除小字符并不是随意删除,而是有条件的,如果整个字符串该小字符只出现了一次,显然不能删除,如果该字符重复出现呢,这时有三种情况:①前面选用了此小字符,那么此字符是必须删除的②前面没有使用此小字符,但此小字符是最后一次出现,这是我们也不能删除(重复字符需要留下一个)③非①②的情况,此时自然是可以删除了,为保证最终字典序最大,使大字符尽可能提前出现。
AcCode
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<cstring>
#define int long long
using namespace std;
const int N = 3e5 + 100;
bool canChang[N];//能否通过此字符改变字典序
signed main() {
int t;
cin >> t;
while (t--) {
string str;
string output;
cin >> str;
map<char, int> vis;
for (int pos = 0; pos < str.length(); pos++) vis[str[pos]] = pos, canChang[str[pos]] = true;
for (int pos = 0; pos < str.length(); pos++) {
if (!canChang[str[pos]]) continue;
while (!output.empty() && output.back() < str[pos] && vis[output.back()] > pos) {
canChang[output.back()] = true;
output.pop_back();
}
output.push_back(str[pos]);
canChang[str[pos]] = false;
}
cout << output << endl;
}
}