zoukankan      html  css  js  c++  java
  • “星云系统”

    传送门
    现在给定你一个字符串 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;
    }
    
  • 相关阅读:
    hdoj 1872 稳定排序
    nyoj 60 谁获得了最高奖学金
    hdoj 2066 一个人的旅行
    nyoj 8 一种排序
    bzoj1798 1
    bzoj4031
    SPOJ-HIGH
    学习笔记::矩阵树定理
    学习笔记::树上莫队
    Strip
  • 原文地址:https://www.cnblogs.com/Emcikem/p/13462427.html
Copyright © 2011-2022 走看看