This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5 + 5;
const int inf = 1e6;
struct str {
    int l0, l1;
    int lazy;
} aint[4 * nmax + 1];
str uneste (str a, str b) {
    str aux;
    aux.lazy = -1;
    aux.l0 = max(a.l0, b.l0);
    aux.l1 = max(a.l1, b.l1);
    return aux;
}
void build (int nod, int x, int y) {
    aint[nod].l0 = aint[nod].l1 = -1;
    aint[nod].lazy = -1;
    if (x == y) return ;
    int mij = (x + y) / 2;
    build(2 * nod, x, mij);
    build(2 * nod + 1, mij + 1, y);
}
void update (int nod, int x, int y, int st, int dr, int val) {
    if (st <= x && y <= dr) {
        if (val == -1) {
            aint[nod].l0 = aint[nod].l1 = aint[nod].lazy = -1;
        } else {
            aint[nod].lazy = val;
            aint[nod].l0 = (val == 0 ? y : -1);
            aint[nod].l1 = (val == 1 ? y : -1);
        }
        return ;
    }
    int mij = (x + y) / 2;
    if (aint[nod].lazy != -1) {
        update(2 * nod, x, mij, x, mij, aint[nod].lazy);
        update(2 * nod + 1, mij + 1, y, mij + 1, y, aint[nod].lazy);
        aint[nod].lazy = -1;
    }
    if (st <= mij)
        update(2 * nod, x, mij, st, dr, val);
    if (mij < dr)
        update(2 * nod + 1, mij + 1, y, st, dr, val);
    aint[nod] = uneste(aint[2 * nod], aint[2 * nod + 1]);
}
vector<int> a, b;
int get_val (int nod, int x, int y, int pos) {
    if (x == y) {
        return aint[nod].lazy;
    }
    int mij = (x + y) / 2;
    if (aint[nod].lazy != -1) {
        update(2 * nod, x, mij, x, mij, aint[nod].lazy);
        update(2 * nod + 1, mij + 1, y, mij + 1, y, aint[nod].lazy);
        aint[nod].lazy = -1;
    }
    if (pos <= mij)
        return get_val(2 * nod, x, mij, pos);
    else
        return get_val(2 * nod + 1, mij + 1, y, pos);
}
void constr_nr (vector<int> &v) {
    string s;
    cin >> s;
    build(1, 1, nmax);
    int cnt = 0;
    for (auto i : s) {
        if (i == 'U') {
            update(1, 1, nmax, cnt, cnt, -1);
            -- cnt;
        } else if (i == '1' || i == '2') {
            update(1, 1, nmax, cnt + 1, cnt + 1, i - '1');
            ++ cnt;
        } else if (i == 'L') {
            int pos = aint[1].l1;
            update(1, 1, nmax, pos, pos, 0);
            if (pos + 1 <= cnt)
                update(1, 1, nmax, pos + 1, cnt, 1);
        } else {
            int pos = aint[1].l0;
            update(1, 1, nmax, pos, pos, 1);
            if (pos + 1 <= cnt)
                update(1, 1, nmax, pos + 1, cnt, 0);
        }
    }
    for (int i = 1; i <= cnt; ++ i)
        v.push_back(get_val(1, 1, nmax, i));
}
int main () {
    constr_nr(a);
    constr_nr(b);
    int ans = a.size() + b.size();
    int dif = 0;
    for (int i = 0; i < (int)a.size() && i < (int)b.size(); ++ i) {
        dif = 2 * dif + a[i] - b[i];
        dif = min(dif, inf);
        ans = min(ans, abs(dif) + (int)a.size() + (int)b.size() - 2 * (i + 1));
    }
    cout << ans << "\n";
    return 0;
}
| # | 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... | 
| # | 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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |