Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define all(x) (x).begin(), (x).end()
- #define itn int
- #define make_unique(x) sort((x).begin(), (x).end()); (x).erase(unique((x).begin(), (x).end()), (x).end())
- using namespace std;
- struct State {
- int x, y;
- array<int, 3> back;
- };
- void drawTable(const map<pair<int, int>, int>& M, int x, int y) {
- int min_x = x, max_x = x;
- int min_y = y, max_y = y;
- for (const auto& [k, v] : M) {
- min_x = min(min_x, k.first);
- max_x = max(max_x, k.first);
- min_y = min(min_y, k.second);
- max_y = max(max_y, k.second);
- }
- for (int i = max_y; i >= min_y; --i) {
- for (int j = min_x; j <= max_x; ++j) {
- char tmp = ' ';
- if (M.count({j, i})) {
- tmp = '0' + M.at({j, i});
- }
- if (j == x && i == y) {
- tmp = '*';
- }
- cerr << tmp;
- }
- cerr << "\n";
- }
- }
- void check(const string& program, long long a, long long b) {
- map<pair<int, int>, int> M;
- long long intended = a + b;
- for (int i = 0; a; ++i, a /= 2) {
- M[{-i, 1}] = a % 2;
- }
- for (int i = 0; b; ++i, b /= 2) {
- M[{-i, 0}] = b % 2;
- }
- auto getInPos = [&](int x, int y) {
- return M.count({x, y}) ? M[{x, y}] : 2;
- };
- vector<State> st;
- State cur = {0, 0, {0, 0, 3}};
- st.push_back(cur);
- for (char c : program) {
- // drawTable(M, cur.x, cur.y);
- // cerr << "=======================\n";
- array<int, 3> new_back = {cur.x, cur.y, getInPos(cur.x, cur.y)};
- if (c == '0') {
- M[{cur.x, cur.y}] = 0;
- } else if (c == '1') {
- M[{cur.x, cur.y}] = 1;
- } else if (c == 'e') {
- M.erase({cur.x, cur.y});
- } else if (c == 'l') {
- --cur.x;
- } else if (c == 'r') {
- ++cur.x;
- } else if (c == 'd') {
- --cur.y;
- } else if (c == 'u') {
- ++cur.y;
- } else if (c == 's') {
- // pass;
- } else if (c == 't') {
- int num = new_back[2] + 1;
- if (num == 3) {
- num = 0;
- }
- for (int it = 0; it < num && (int)st.size() > 1; ++it) {
- cur.x = cur.back[0];
- cur.y = cur.back[1];
- if (cur.back[2] == 2) {
- M.erase({cur.x, cur.y});
- } else {
- M[{cur.x, cur.y}] = cur.back[2];
- }
- st.pop_back();
- cur = st.back();
- }
- } else {
- assert(false);
- }
- if (c != 't') {
- cur.back = new_back;
- st.push_back(cur);
- }
- }
- long long result = 0;
- assert(M.count({cur.x, cur.y}));
- // drawTable(M, cur.x, cur.y);
- while (M.count({cur.x, cur.y})) {
- result = result * 2 + M[{cur.x++, cur.y}];
- assert(result <= intended);
- }
- assert(result == intended);
- }
- const int kMaxLength = 100000;
- int main() {
- // int n = inf.readInt();
- // vector<pair<long long, long long>> a(n);
- // for (int i = 0; i < n; ++i) {
- // a[i].first = inf.readLong();
- // a[i].second = inf.readLong();
- // }
- vector<pair<long long, long long>> a = {{123456789, 987654321}};
- // string s = ouf.readString("[01elrudst]*");
- string s = "d0luuu1ddd0s10usususttttttl1l0l0l0l1l1l1l0l1l0l1l1l0l0l0l1l0l1l1l1l0l0l0l1l0l0l0l0l1lr";
- assert((int)s.length() <= kMaxLength);
- for (auto p : a) {
- check(s, p.first, p.second);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment