这题贪心还是比较好写的…
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int top=0;
char s[maxn],minn,flag[maxn],q[maxn];
string u;
int main()
{
cin >> (s+1);
int len=strlen(s+1);
minn=s[len];flag[len]='!';
for(int i=len-1;i>=1;i--)
{
if(minn<s[i]) flag[i]=minn;
else flag[i]='!';
minn=min(minn,s[i]);
}
for(int i=1;i<=len;i++)
{
if(flag[i]=='!')//现在这个字母就是最小的
{
while(top>=1&&q[top]<=s[i]) cout<<q[top--];
cout<<s[i];
}
else//后面有更小的字母
{
while(top>=1&&q[top]<=flag[i]) cout<<q[top--];
q[++top]=s[i];
}
}
while(top) cout<<q[top--];
}