Submission #596068

#TimeUsernameProblemLanguageResultExecution timeMemory
596068alextodoranBoard (CEOI13_board)C++17
100 / 100
5 ms852 KiB
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> using namespace std; typedef long long ll; string convert (string path) { vector <pair <bool, int>> blocks = {{1, 1}}; for (char c : path) { if (c == '1') { if (blocks.back().first == 0) { blocks.back().second++; } else { blocks.push_back({0, 1}); } } else if (c == '2') { if (blocks.back().first == 1) { blocks.back().second++; } else { blocks.push_back({1, 1}); } } else if (c == 'U') { if (--blocks.back().second == 0) { blocks.pop_back(); } } else if (c == 'L') { int tail = 0; if (blocks.back().first == 0) { tail = blocks.back().second; blocks.pop_back(); } if (--blocks.back().second == 0) { blocks.pop_back(); } if (blocks.back().first == 0) { blocks.back().second++; } else { blocks.push_back({0, 1}); } if (tail != 0) { blocks.push_back({1, tail}); } } else if (c == 'R') { int tail = 0; if (blocks.back().first == 1) { tail = blocks.back().second; blocks.pop_back(); } if (--blocks.back().second == 0) { blocks.pop_back(); } if (blocks.back().first == 1) { blocks.back().second++; } else { blocks.push_back({1, 1}); } if (tail != 0) { blocks.push_back({0, tail}); } } } string binary; for (pair <bool, int> block : blocks) { while (block.second--) { binary += (block.first == 1 ? '1' : '0'); } } return binary; } string getDiff (string A, string B) { string C; C.resize((int) A.size()); int carry = 0; for (int i = (int) C.size() - 1; i >= 0; i--) { int here = (int) (A[i] == '1') - (int) (B[i] == '1') + carry; if (here < 0) { here += 2; carry = -1; } else { carry = 0; } C[i] = (here == 1 ? '1' : '0'); } reverse(C.begin(), C.end()); while ((int) C.size() > 1 && C.back() == '0') { C.pop_back(); } reverse(C.begin(), C.end()); return C; } int getInt (string binary) { int ret = 0; int pw = 1; while (binary.empty() == false) { if (binary.back() == '1') { ret += pw; } binary.pop_back(); pw *= 2; } return ret; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); string A, B; cin >> A >> B; A = convert(A); B = convert(B); int cost = 0; while ((int) A.size() < (int) B.size()) { cost++; B.pop_back(); } while ((int) B.size() < (int) A.size()) { cost++; A.pop_back(); } if (A < B) { swap(A, B); } string C = getDiff(A, B); while ((int) C.size() > 20) { A.pop_back(); B.pop_back(); C.pop_back(); cost += 2; } int diff = getInt(getDiff(A, B)); int answer = diff + cost; while (diff > 0) { diff /= 2; if (A.back() == '0' && B.back() == '1') { diff++; } A.pop_back(); B.pop_back(); cost += 2; answer = min(answer, diff + cost); } cout << answer << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...