CSL 的字符串
https://ac.nowcoder.com/acm/contest/551/D
单调栈的神仙题,真的nb
想法很简单,例如dcaad,
1 d
2 d ---> c (后面还有d,可以弹出d,然后再放置c)
3 c ---> ca (后面没有c了,不能弹出c)
4 ca -- > ca (a在栈里不管他)
5 ca ---> cad(b>a可以直接放置)
所以答案cad
#include<iostream>
#include<stack>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
using namespace std;
const int maxn = 2e5 + 11;
vector<int>G[200];
map<char, int>cnt,vis;
stack<char> ins;
string sn, ans;
int main() {
cin >> sn;
for (int i = 0; i < sn.size(); i++) {
cnt[sn[i]]++;
}
for (int i = 0; i < sn.size(); i++) {
cnt[sn[i]]--;
if (vis[sn[i]]) continue;
if (ins.size() == 0) {
ins.push(sn[i]);
vis[sn[i]] = 1;
}
else {
while (ins.size()) {
if (ins.top() < sn[i]) {
break;
}
else {//弹出
if (cnt[ins.top()] == 0) {//不能弹出了
break;
}
else {
vis[ins.top()] = 0;
ins.pop();
}
}
}
vis[sn[i]] = 1;
ins.push(sn[i]);
}
}
while (ins.size()) {
ans.push_back(ins.top());
ins.pop();
}
reverse(ans.begin(), ans.end());
cout << ans << endl;
return 0;
}
寻找真正的热爱

浙公网安备 33010602011771号