RGB рядок#12320

RGB рядок (Розбір)

Автор задачі:

Андрій Холод (Connect)

Підготував:

Андрій Холод (Connect)

Аналіз:

Андрій Холод (Connect)

Розв’язок

Розглянемо відрізок довжиною . Давайте поставимо в першу позицію елемент , в другу поставимо , в третю . Тоді розглянемо елементи які вже входять в трійку яка закінчується в позиції , в позиції — , в позиції — . Отже єдиний елемент яким ми зможемо поставити в позицію — . Тим самим принципом розташуємо елементи в позиціях та . Також умова красоти буде зберігатись і в трійках які починаються в та позиціях.

Тоді таким же принципом можемо довести що рішення не існує для всіх які не діляться націло на .

Тоді рішенням задачі буде спробувати підставити всі можливі розташування елементів , , та без повторів та вибрати найвигідніший варіант.

Асимптотика рішення .

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define endl '\n'
#define pb push_back

const ll clasik = 2e5+17;
const ll INF = 1e17;
ll w[clasik] , pref[clasik] , poslid[clasik];

void solve() {

    ll n;

    cin>>n;

    string line;

    cin>>line;

    if (n%3 != 0) {
        cout<<-1<<endl;
        return;
    }

    ll res = INF;

    //R G B


    ll curr = 0;

    for (int i = 0 ; i < n ; i+=3) {
        curr += (line[i]!='R');
        curr += (line[i+1]!='G');
        curr += (line[i+2]!='B');
    }

    res = min(res , curr);

    // R B G

    curr = 0;

    for (int i = 0 ; i < n ; i+=3) {
        curr += (line[i]!='R');
        curr += (line[i+1]!='B');
        curr += (line[i+2]!='G');
    }

    res = min(res , curr);

    // B R G

    curr = 0;

    for (int i = 0 ; i < n ; i+=3) {
        curr += (line[i]!='B');
        curr += (line[i+1]!='R');
        curr += (line[i+2]!='G');
    }

    res = min(res , curr);

    // B G R

    curr = 0;

    for (int i = 0 ; i < n ; i+=3) {
        curr += (line[i]!='B');
        curr += (line[i+1]!='G');
        curr += (line[i+2]!='R');
    }

    res = min(res , curr);

    // G R B

    curr = 0;

    for (int i = 0 ; i < n ; i+=3) {
        curr += (line[i]!='G');
        curr += (line[i+1]!='R');
        curr += (line[i+2]!='B');
    }

    res = min(res , curr);

    // G B R

    curr = 0;

    for (int i = 0 ; i < n ; i+=3) {
        curr += (line[i]!='G');
        curr += (line[i+1]!='B');
        curr += (line[i+2]!='R');
    }

    res = min(res , curr);

    cout<<res<<endl;

}  

signed main() {
    speed;
    int test;
    test = 1;
    //cin>>test;
    while (test--) solve();
    return 0;
}