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... |