Day8 蓝桥杯acw讲解

发布于:2025-02-27 ⋅ 阅读:(14) ⋅ 点赞:(0)

首先先给大家看一道这个题,

 我真的是太喜欢y总了,如果大家也是最近在准备蓝桥杯或者计算机相关的比赛,但是得加一个前提就是必须最好基础真的很好,要不然其实买了课,也没啥太大的用处,其实就可以以我本人举例子,其实我记得我刚开始的时候其实我真的就觉得我自己不适合听这个的课,后来我开始去学习了算法,有用,但是又没有那么很有用,然后我呢,就觉得那这样我就再去看看acw吧,结果真的很意外,我发现我自己开始渐渐的能听懂了,✌,开心,所以可能学习这个东西就是一个循序渐进的过程,啥时候都不能着急!!!

我觉得这道题非常的活,但是一定要找到每个题的题眼,其实有的时候别老太单纯就只是那么想,可以灵活变通一下!!!

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 20010;
bool st[26][26];
char s[N];
int cnt[26][26];
int n, m;

void updata(int l, int r, int v)
{
    l = max(0, l);
    r = min(r, n - 1);
    for (int i = l; i + 2 <= r; i++)
    {
        char a = s[i], b = s[i + 1], c = s[i + 2];
        if (a != b && b == c)
        {
            cnt[a][b] += v;
            if (cnt[a][b] >= m)
            {
                st[a][b] = true;
            }
        }
    }
}

int main()
{
    cin >> n >> m >> s;
    for (int i = 0; i < n; i++)
    {
        s[i] = s[i] - 'a';  // 将字符转化为数字
    }
    updata(0, n - 1, 1);

    for (int i = 0; i < n; i++)
    {
        char q = s[i];
        updata(i - 2, i + 2, -1);
        for (int p = 0; p < 26; p++)
        {
            if (p != q)
            {
                s[i] = p;
                updata(i - 2, i + 2, 1);
                updata(i - 2, i + 2, -1);
            }
        }
        s[i] = q;
        updata(i - 2, i + 2, 1);
    }

    int res = 0;
    for (int i = 0; i < 26; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            if (st[i][j])
            {
                res++;
            }
        }
    }
    cout << res << endl;
    for (int i = 0; i < 26; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            if (st[i][j])
            {
                cout << (char)(i + 'a') << (char)(j + 'a') << (char)(j + 'a') << endl;
            }
        }
    }

    return 0;
}