题意:给定一个非空串s,和两个空串u,t。
可以进行一下两个操作
1.提取s首字符加到u
2.提取u端末尾字符到t。
求使得字符串t最小并输出
思路:首先预处理,计算出每种字符个数,然后从小到大开始,使得t的前端尽量小,用一个栈维护u端末尾字符,栈顶是u端末尾字符。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 1e5+10;
char s[maxn];
int num[27];
int main()
{
while(~scanf("%s",s))
{
memset(num,0,sizeof(num));
stack<char> sss;
int len = strlen(s);
for(int i=0;i<len;i++)
num[s[i]-'a']++;
int j=0,cnt=0;
for(int i=0;i<=25;i++)
{
if(num[i]==0)continue;
while(!sss.empty()&&sss.top()<='a'+i)
{
printf("%c",sss.top());
sss.pop();
}
for(;j<len;j++)
{
if(num[i]==0)break;
if(s[j]=='a'+i)
printf("%c",'a'+i);
else
sss.push(s[j]);
num[s[j]-'a']--;
}
}
while(!sss.empty())
{
char cur=sss.top();sss.pop();
printf("%c",cur);
}
printf("\n");
}
}