P1106 删数问题(单调栈)

用单调栈维护一个答案序列。

把比 s [ i ] s[i] s[i]大的栈顶都删掉。

最后栈里的 n − k n-k nk个就是答案。

注意删去前导0

// Problem: P1106 删数问题
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1106
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-05-10 23:23:11
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=255,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n]); 
}
char ans[N];
int main(){
	string s;int k;IOS;cin>>s>>k;
	int n=SZ(s);
	stack<char>st;
	st.push(s[0]);
	int c=0;
	for(int i=1;i<n;i++){
		while(!st.empty()&&st.top()>s[i]&&c<k){
			st.pop();
			c++;
		}
		st.push(s[i]);
	}
	while(c<k){
		st.pop();
		c++;
	}
	c=n-k;
	ans[c--]='\0';
	while(c>=0) ans[c--]=st.top(),st.pop();
	c=0;while(c<n-k-1&&ans[c]=='0') c++;
	printf("%s",ans+c);
	return 0;
}