假设你在玩下面这个简单的电脑游戏。屏幕显示了n个排列整齐的立方体。每个立方体被涂上m种颜色中的一种。您可以删除不超过k个数据集(这些数据集不必一个接一个地删除)。之后,其余的***数据集连接在一起(这样间隙就被关闭了),系统计算分数。你得到的点数等于连续出现的相同颜色方块的最大序列的长度。编写一个程序,确定您可以得分的最大可能的点数。
记住,删除的数据集不能超过k个。完全不允许删除***数据集。
输入
第一行包含三个整数n, m和k(1≤n≤2·105,1≤m≤105,0≤k < n)。第二行包含从1到m的n个整数——立方体颜色的个数。颜色的数量由单个空格分隔。
输出
打印您可以得分的最大可能点数。

题意:给你一个序列a, 序列中的颜色a[i]代表一种颜色,每种用1-m表示,然后你有最多k次删除其中的一些颜色,删除后相邻位置连接,问:你在不超过k个删除是,使得序列连续颜色最大

题解:双指针,首先我们以左边第一个颜色a[l]为最长序列,然后判断r指针在满足(r - l + 1) - (cnt[a[l])<= k 条件下向后移动最多能走多远,不能走就l向前移动,再以a[l]作为最长序列

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int a[maxn], cnt[maxn];
int main() {
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    int l = 1, r = 1;
    int ans = 0;
    cnt[a[1]]++;
    while (l <= n) {
        if (((r - l + 1) - cnt[a[l]]) <= k){
//            cout << l << " " << r << endl;
            ans = max(ans, cnt[a[l]]);
            if (r < n) {
                r++; cnt[a[r]]++;
            } else {
                cnt[a[l]]--; l++;
            }
        } else {
            cnt[a[l]]--;
            l++;
        }
    }
    printf("%d\n", ans);
    return 0;
}