2024年度第五届全国大学生算法设计与编程挑战赛(春季赛)

赛后A题

众所周知,出题是一项挺辛苦的活,组题更是一个技术活,所以有时候即使出题人想着给大家送点分,也会因为阴差阳错的出题和奇葩离谱的组题而变得无法送到大家的手中。

你现在是这场考试的组题人,你正在为这个事情发愁呢……

你现在手上有很多道题目,每个题目有一个核心的知识点,我们用一个字符来代表每个题目的知识点,并且字符的大小表示了知识点的难度。

于是所有的题目可以用一个字符串来表示,比如 "abca" 表示有四道题,知识点分别为 a、b、c 和 a,并且第三道题是最难的,第一道题和第四道题难度一样。

作为组题人,你需要能够识别出一样的套题,以及比较套题的难度。

如果两套题的题目按照顺序对比知识点是一样的,那么我们就说这两套题是一样的,比如任意的 "abca" 都是一样的,但是 "abca" 和 "aabc" 是不一样的,因为题目知识点的排列不一样。

我们判断两套题哪套更难有一个很简单的方法,就是看两套题的知识点字典序哪个更大,字典序越大越困难,比如 "zzba" 就比 "abc" 要难非常多,"abb“ 就比 "ab" 要难。

临近截止日期,你已经没有精力去细致地挑选题目了,于是你打算选一段连续的题目组成一套题,并且你希望选出不同的套题中第 𝐾K 简单的套题来给大家送分,你可以找出这一套题来吗?

输入格式:

第一行一个字符串 𝑠,表示所有题目的知识点。

接下来一行一个整数 K,表示需要找的套题的难度。

输出格式:

输出一行一个字符串,表示找到的第𝐾简单的套题的知识点。

输入样例:

aba
4

输出样例:

b

对于给定的样例,前 4 简单的套题分别为:a、ab、aba、b,故答案为 b。

对于 100%100% 的数据,1≤∣𝑠∣≤5000,1≤𝐾≤51≤∣s∣≤5000,1≤K≤5,保证答案存在。

import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class Main {
    static
    class FastReader {
    private StringTokenizer tokenizer = new StringTokenizer("");
    private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        public boolean hasNext() {
            while (!tokenizer.hasMoreTokens()) {
                String nextLine = innerNextLine();
                if (nextLine == null) {
                    return false;
                }
                tokenizer = new StringTokenizer(nextLine);
            }
            return true;
        }
        public String next() {
            hasNext();
            return tokenizer.nextToken();
        }
        public int nextInt() {
            return Integer.parseInt(next());
        }
        public long nextLong() {
            return Long.parseLong(next());
        }
        private String innerNextLine() {
            try {
                return reader.readLine();
            } catch (IOException ex) {
                return null;
            }
        }
        public String nextLine() {
            tokenizer = new StringTokenizer("");
            return innerNextLine();
        }
    }

    public static void main(String[] args) {
        FastReader sc = new FastReader();
        String s = sc.next();
        int k = sc.nextInt();
        TreeSet<String> ts = new TreeSet<>();
        int n = s.length();
        for (int i = 0; i < n; i++) {
            for (int j = 1; j <= 5 && i + j <= n; j++) {
                ts.add(s.substring(i, i + j));
            }
        }
        int counter = 0;
        for (String kk: ts) {
            counter++;
            if (counter == k) {
                System.out.println(kk);
            }
        }
    }

    public long funcLjyhz(int[] nums) {
        long sum = 0;
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        for (int i = nums.length - 1; i >= 2; i--) {
            sum -= nums[i];
            if (sum > nums[i]) {
                return sum + nums[i];
            }
        }
        return -1;
    }
}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值