题意:给个字符串,求最小修改几个字符,使得其中出现一段长度为k的子串是"RGBRGBRGBRGB…"的子串,对于每个长度为k的子串,它有三种可能的顺序,开3个前缀数组记录每个位置对于三种顺序需要改多少个,然后枚举维护每一段长度为k的子串关于每个顺序的最小值。
int t;
int p[3][N];
int main()
{
string s;
int n, k;
cin >> t;
string ju = "RGB";
while (t--)
{
scanf("%d%d", &n, &k);
cin >> s;
f(i, 0, 2)p[i][0] = 0;
f(i, 0, s.size() - 1)
{
f(j, 0, 2)p[j][i+1] = p[j][i] + (s[i] !=ju[(i + j) % 3]);
}
int ans = 2e9;
f(i, 0, 2)
{
for (int j = k;j <= s.size();j++)
{
ans = min(ans, p[i][j] - p[i][j-k]);
}
}
cout << ans << endl;
}
return 0;
}