1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Author : Jakub Rożek
// Task   : Mrowki
// Memory : O(n)
// Time   : O(n)
// Solv   : Rozwiązanie wzorcowe

#include "bits/stdc++.h"
using namespace std;
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORD(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i,n) for(int i=0; i<(n); ++i)

int n, x;
string s;
vector<int> odp;

void solution() {
    cin >> n >> s;
    odp.resize(n);

    // x mowi nam ile razy sie mrowka odbila z jednej strony w kttora chce uciec
    // a z drugiej zakladamy ze jest nieskonczenie wiele odpic.
    // To zalozenie liczymy z 2 stron i bierzemy minimum.

    x = 0;
    REP (i, n) {
        if (s[i] == 'L') {
            odp[i] = 2*x;
        } else {
            odp[i] = 2*x+1;
            ++x;
        }
    }

    x = 0;
    FORD (i, n-1, 0) {
        if (s[i] == 'L') {
            odp[i] = min(odp[i], 2*x+1);
            ++x;
        } else {
            odp[i] = min(odp[i], 2*x);
        }
    }

    x = 0;
    for (auto i:odp) {
        if (x) cout << " ";
        ++x;
        cout << i;
    }
    cout << "\n";
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int tests = 1;
    // cin>>tests;
    FOR (i,1,tests) {
        solution();
    }    
    return 0;
}