#pragma GCC optimize("O3")
#include <bits/stdc++.h>
const int MAXN = 401;
int dp[MAXN][MAXN][MAXN][3];
int help[3][3][MAXN];
signed
main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    
    int n;
    std::cin>>n;
    
    std::string s;
    std::cin >> s;
    
    std::vector<std::vector<int>> all_ind(3);
    for(int i =0 ;i < s.size();i++){
        if(s[i] == 'R'){
            all_ind[0].push_back(i);
            for(int j = 0;j < 3;j++){
                help[j][0][all_ind[0].size() - 1] = all_ind[j].size();
            }
        }else if(s[i] == 'G'){
            all_ind[1].push_back(i);
            for(int j = 0;j < 3;j++){
                help[j][1][all_ind[1].size() - 1] = all_ind[j].size();
            }
        }else{
            all_ind[2].push_back(i);
            for(int j = 0;j < 3;j++){
                help[j][2][all_ind[2].size() - 1] = all_ind[j].size();
            }
        }
    }
    // std::cout<<help[0][1][0]<<std::endl;
   
    for(int  i=0 ;i < MAXN;i++){
        for(int j =0;j < MAXN;j++){
            for(int z = 0;z < MAXN;z++){
                for(int k =0 ;k < 3;k++){
                    dp[i][j][z][k] = 1e8;
                }
            }
        }
    }
    dp[0][0][0][0] = 0;
    dp[0][0][0][1] = 0;
    dp[0][0][0][2] = 0;
    for(int i = 0;i <= all_ind[0].size();i++){
        for(int j =0 ;j <= all_ind[1].size();j++){
            for(int z = 0;z <= all_ind[2].size();z++){
                if(i == 0 && j == 0 && z == 0)continue;
                if(i > 0){
                    int tmp = (help[1][0][i - 1] <= (j) ? -(help[1][0][i - 1] - (j)) : 0) + 
                    (help[2][0][i - 1] <= (z) ? -(help[2][0][i - 1] - (z)) : 0); 
                    dp[i][j][z][0] = dp[i - 1][j][z][1] + tmp;
                    dp[i][j][z][0] = dp[i][j][z][0] < dp[i - 1][j][z][2] + tmp ? dp[i][j][z][0] : dp[i - 1][j][z][2] + tmp;
                }
                if(j > 0){
                    int tmp = (help[0][1][j - 1] <= (i) ? -(help[0][1][j - 1] - (i)) : 0) + 
                    (help[2][1][j - 1] <= (z) ? -(help[2][1][j - 1] - (z)) : 0);
                    dp[i][j][z][1] = dp[i][j - 1][z][0] + tmp;
                    dp[i][j][z][1] = dp[i][j][z][1] < dp[i][j - 1][z][2] + tmp ? dp[i][j][z][1] : dp[i][j - 1][z][2] + tmp;
                }
                if(z > 0){
                    int tmp = (help[0][2][z - 1] <= (i) ? -(help[0][2][z - 1] - (i)) : 0) + 
                    (help[1][2][z - 1] <= (j) ? -(help[1][2][z - 1] - (j)) : 0);
                    dp[i][j][z][2] = dp[i][j][z - 1][0] + tmp;
                    dp[i][j][z][2] = dp[i][j][z][2] < dp[i][j][z - 1][1] + tmp ? dp[i][j][z][2] : dp[i][j][z - 1][1] + tmp;
                }
                // std::cout<<i<<' '<<j<<' '<<z<<' '<<dp[i][j][z][0]<<' '<<dp[i][j][z][1]<<' '<<dp[i][j][z][2]<<std::endl;
            }
        }
    }
    int best = std::min(dp[all_ind[0].size()][all_ind[1].size()][all_ind[2].size()][0],
    dp[all_ind[0].size()][all_ind[1].size()][all_ind[2].size()][1]);
    best = std::min(best,dp[all_ind[0].size()][all_ind[1].size()][all_ind[2].size()][2]);
    if(best > 1e6){
        std::cout<<-1;
    }else{
        std::cout<<best;
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |