“星云系统”

传送门
现在给定你一个字符串 s 以及一个整数 k,请求出 s 的字典序最小的长度为 k 的子序列。

利用单调栈维护一个栈
如果栈顶元素字典序大于当前字符的字典序,而且剩下的字符足够使得栈里的元素长度为k个,那么就把栈顶元素pop掉,而加入当前字符。

同理可以维护最大的那个字典序

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
const int N = 5e6 + 5;
int top;
char a[N], stk[N];
int main(){
    int n, k;
    scanf("%s", a + 1);
    n = strlen(a + 1);
    scanf("%d", &k);
    
    for(int i = 1; i <= n; i++) {
        while(top > 0 && stk[top] > a[i] && (top + n - i + 1) > k) top--;
        stk[++top] = a[i];
    }
    for(int i = 1; i <= k; i++) // 输出前面k个栈元素
        printf("%c", stk[i]);
    putchar('
');
    return 0;
}
原文地址:https://www.cnblogs.com/Emcikem/p/13462427.html