此题是一个贪心加双指针的问题,可以对任意位置进行染色,所以我们可以对每一种颜色来单独看待,对于每一种颜色我们记录这一种颜色所出现的所有的位置,若我们想要得到最长的连续,最优的一定是利用染色去“连接”记录位置中每一段,即去填补两段相同颜色之间的空缺,填补完后剩下的次数不足以补足即可以接在最长的段两旁,所以对于每一种颜色我们可以用双指针枚举要填补的所有空缺段后最长段的左右节点,之所以可以用双指针枚举,因为对于有限染色次数,当固定一个端点后另一端点的位置是符合单调性的
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
小红很喜欢给玻璃珠染成不同的颜色,他现在有一排N个玻璃珠,第i个玻璃珠的颜色是ci,他现在有M种颜色,他希望找到最长的一串颜色相同的玻璃珠(一串表示下标是连续的),他现在有K次操作可以把K个位置的玻璃珠染成任意的颜色。
小红想知道,经过最多K次操作之后,它可以得到的最长的一串颜色相同的玻璃珠是多长?
注意:你最多对K个位置染色,你也可以选择不染色。
第一行三个数N,M,K(1≤N,M≤2×105,0≤K≤N)分别表示玻璃球的数量,玻璃球的颜色以及操作的最多次数。
第二行N个数,ci(1≤ci≤M)表示小红还没有染色之前玻璃珠的颜色,
输出一个值sum表示小红可以得到的最长的一串玻璃珠。
输入
5 5 1
1 2 1 3 3
输出
3
说明
把2位置的颜色改成1,或者把3位置的颜色变成3都可以得到长度为3的答案。
输入
4 4 0
1 2 3 4
输出
1
说明
不能修改颜色,所以答案是1。