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;
}
posted @ 2022-04-07 23:38  FPICZEIT  阅读(10)  评论(0编辑  收藏  举报