xjtuoj 1024 JM的西伯利亚特快专递
被自己蠢到了......
70->73->90->63
一开始写的极其冗杂,居然还拿到了90分
总之就是预处理一下正常字典序的个数,每取一个删一个。当目标字符和预处理中字典序的顺序字符相同时先和$T$的末尾进行一下比较,当$a_i\leq T_n$时就把$T_n$取出来加到$U$中去,反之直接加到$U$上去。如果不相同直接扔到$T$里去
代码
#include <bits/stdc++.h>
/*
我是大傻逼
*/
#define F(i, n, m) for (int i = n; i < m; i++)
typedef unsigned long long ull;
typedef long long ll;
using namespace std;
int sp[30], rsp[30];
void strp(string s1) {
F(i, 0, s1.size()) {
sp[s1[i] - 'a']++;
}
}
int main() {
std::ios::sync_with_stdio(false);
string s1;
cin >> s1;
strp(s1);
string t, u;
char tg;
int fi = 0;
F(i, 0, s1.size()) {
while (sp[fi] == 0 && fi <= 26) fi++;//预处理当前字符串剩下应该先取哪个字符
tg = fi + 'a';
if(!t.empty()&&t[t.size()-1]<=tg) {//判断下T非空
u.push_back(t[t.size()-1]);
t.erase(t.size() - 1);
i--;
} else {
t.push_back(s1[i]);
sp[s1[i]-'a']--;
}
// cout<<u<<" "<<t<<" "<<s1[i]<<" "<<tg<<endl;
}
cout << u;
string::reverse_iterator r = t.rbegin();
for (; r < t.rend(); r++) cout << *r;
return 0;
}