蓝桥杯集训·每日一题2025 哞叫时间

农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。

他说「竞赛中我最喜欢的部分是贝茜说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。

埃尔茜仍然不理解,所以农夫约翰将竞赛以文本文件形式下载,并试图解释他的意思。

竞赛被定义为一个长度为 NN 的小写字母字符串。

一种哞叫一般地定义为子串 cicjcjcicjcj,其中某字符 cici 之后紧跟着 22 个某字符 cjcj,且 ci≠cjci≠cj。

根据农夫约翰的说法,贝茜哞叫了很多,所以如果某种哞叫在竞赛中出现了至少 FF 次,那可能就是贝茜发出的。

然而,农夫约翰的下载可能损坏,文本文件可能存在至多一个字符与原始文件不同。

将可能的误差考虑在内,输出所有可能是贝茜发出的哞叫,按字母顺序排序。

输入格式

输入的第一行包含 NN 和 FF,表示字符串的长度以及贝茜的哞叫的频次下限。

第二行包含一个长度为 NN 的小写字母字符串,表示竞赛。

输出格式

输出可能是贝茜发出的哞叫的数量,以下是按字典序排序的哞叫列表。

每行输出一种哞叫。

数据范围

3≤N≤200003≤N≤20000,
1≤F≤N

遍历所有可能性  包括字符的修改 使用Temp类来记录数据的尾部以及数据是否使用了一次修改的机会 然后采用hashMap存储 没什么好说的 写的有点崩溃 要考虑的条件太多了 只能一点一点慢慢改 最后写出一堆屎山

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String[] s = bufferedReader.readLine().split(" ");
        int n = Integer.parseInt(s[0]);
        int f = Integer.parseInt(s[1]);
        String[] split = bufferedReader.readLine().split("");
        HashMap map = new HashMap<>();
        for (int i = 0; i < n - 2; i++) {
            String string;
            Temp temp;
            if (!split[i + 1].equals(split[i + 2])){
                for(int z = 0;z < 1;z++) {
                    if (split[i].equals(split[i + 1 + z])) {
                        continue;
                    }
                    string = split[i] + split[i + 1 + z] + split[i + 1 + z];
                    temp = new Temp(string);
                    temp.chance--;
                    temp.last = i + 2;
                    if (map.containsKey(string)) {
                        if (split[i + 1].equals(split[i + 2]) && map.get(string).last < i) {
                            map.get(string).times++;
                            map.get(string).last = i + 2;
                        } else if (!split[i + 1].equals(split[i + 2]) && map.get(string).chance != 0 && map.get(string).last < i) {
                            map.get(string).last = i + 2;
                            map.get(string).times++;
                            map.get(string).chance--;
                        }
                    } else {
                        map.put(string, temp);
                    }
                }
            }else {
                for (char j = 'a';j <= 'z';j++){
                    if (String.valueOf(j).equals(split[i + 1])){continue;}
                    string = j + split[i + 1] + split[i + 1];
                    temp = new Temp(string);
                    temp.last = i + 2;
                    if (!String.valueOf(j).equals(split[i])){
                        temp.chance--;
                    }
                    if (map.containsKey(string)){
                        if (String.valueOf(j).equals(split[i]) && map.get(string).last < i){
                            map.get(string).times++;
                        map.get(string).last = i + 2;}
                        else if(!String.valueOf(j).equals(split[i]) && map.get(string).last < i){
                            if (map.get(string).chance != 0 && map.get(string).last < i){map.get(string).times++;map.get(string).chance--;map.get(string).last = i + 2;}
                        }
                    }else {
                        map.put(string,temp);
                    }
                }
            }

        }
        Collection values = map.values();
        ArrayList strings = new ArrayList<>();
        for (Temp temp :values) {
            if (temp.times >= f){strings.add(temp.s);}
        }
        strings.sort(String::compareTo);
        System.out.println(strings.size());
        for (String string :strings) {
            System.out.println(string);
        }

    }
}
class Temp{
    int chance  = 1;
    int times = 1;
    int last;
    String s;
    public Temp(String  string){
        this.s = string;
    }

}

你可能感兴趣的:(蓝桥杯,职场和发展)