zoukankan      html  css  js  c++  java
  • SICAU-OJ: 第k小

    第k小

    题意:

    给出一个长度不超过5000的字符串,然后让你找出第K小的字串(1<=K<=5)。重复的串大小相等。

    题解:

    这里我们知道某些串的前缀是肯定小于等于其本身的。

    那么长度为5的串的前缀,肯定依次是最小,第二小....第五小。

    所以因为这里1<=K<=5,我们便可以用一个set来维护所有长度不超过5的子串。要用点贪心的思想去解决(每次从最小的那个字符开始选子串)

    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 5005;
    char s[N];
    set <char> tmp;
    set <string> S;
    int k;
    int main(){
        scanf("%s",s);
        scanf("%d",&k);
        int len =strlen(s);
        for(int i=0;i<len;i++) tmp.insert(s[i]);
        while(1){
            auto it = tmp.begin();
            auto now = *it;
            for(int i=0;i<len;i++){
                if(s[i]==now){
                    char c[N];int tot=0;;
                    for(int j=i;j<len;j++){
                        c[tot++]=s[j];
                        c[tot]='';
                        S.insert(c);
                        if(tot-1>k) break;
                    }
                }
            }
            int flag=0;
            int num=S.size();
            tmp.erase(it);
            if(num>=k){
                flag=1;int cnt=0;
                for(auto it2 = S.begin();it2!=S.end();it2++){
                    cnt++;
                    if(cnt==k){
                        cout<<*it2;
                        break;
                    }
                }
            }
            if(flag) break;
        }
        return 0;
    }
  • 相关阅读:
    C#基础
    进制转换
    养猪和存储空间
    独热码和二进制码
    mux_xz
    饮料机
    亚稳态
    mos管功耗
    功能覆盖率和代码覆盖率
    时序逻辑电路输出特点
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10099375.html
Copyright © 2011-2022 走看看