CF1196D2 RGB Substring (hard version)

https://www.luogu.com.cn/problem/CF1196D2
前缀和
黄色题
思路:
看当前输入要被修改的这个字符串的第i位,是否与'R','G','B'三个中的一个相等,不相等的另外两个则增加一次修改次数
最后取以'RGB','GBR','BGR'中选其中一个开头的最小修改次数

#include<iostream>
#include<cstring>
using namespace std;
const int M=2e5+10;
char s[M];
int a[3][M];
int T,n,k,ans;
int main() {
    cin>>T;
    while(T--) {
        a[0][0]=a[1][0]=a[2][0]=0;
        cin>>n>>k;
        cin>>s;
        ans=M;
        string t="RGB";
        for(int i=0; i<n; i++) {
            for(int j=0;j<=2;j++){
                if(s[i]!=t[(i+j)%3])a[j][i+1]=a[j][i]+1;
                else a[j][i+1]=a[j][i];
            }
        }//a从下标为1的位开始&前缀和
        for(int i=0; i+k<=n; i++) {
            for(int j=0;j<=2;j++){
                ans=min(ans,a[j][i+k]-a[j][i]);
            }
        } //遍历求ans
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2022-08-19 18:07  -イレイナ  阅读(25)  评论(0)    收藏  举报