Codeforces1078E

我们可以支持如果当前格子是 空/0/1 向某个方向走一步

  • 如果当前格子是 1 向右走一步: rlst
  • 如果当前格子是空向左走一步: rltl

可以支持将当前位置的 0/1 复制到自己的某个方向,也可以支持复制后异或 1

  • 将当前位置复制到上面一个格子: u10dt
  • 将当前位置异或 1 的值复制到上面一个格子: u01dt

还可以支持位运算操作

  • 将当前位置变成和右边一个位置的 and:0rt
  • 将当前位置变成和右边一个位置的 or:rr01ltl10rtl1rt

异或操作比较麻烦,我们可以支持这样一个操作

  • 如果当前位置是 0,且右边的格子位置也是 0,将右边的右边的格子设成 0/1:rltrlt(0/1)

但是这样无法确定最后所在的位置,我们可以在左边的几个格子处放一个 0,做完上面的操作后执行:lllrltl

还有一种不用讨论的异或方法,对于两个布尔变量 a 和 b,我们有 a ^ b = (!a & b) | (a & !b),用前面的两种位运算操作就行了

然后就是大讨论了

spj

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define per(i, a, b) for (int i = a; i >= b; i--)
using namespace std;

typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef long long ll;

template <typename _T>
inline void read(_T &f) {
	f = 0; _T fu = 1; char c = getchar();
	while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
	while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
	f *= fu;
}

template <typename T>
void print(T x) {
	if (x < 0) putchar('-'), x = -x;
	if (x < 10) putchar(x + 48);
	else print(x / 10), putchar(x % 10 + 48);
}

template <typename T>
void print(T x, char t) {
	print(x); putchar(t);
}

const int N = 1e5 + 5;

map <pii, bool> a[N];
int x[N], y[N];
int now = 0;

void doit(char c) {
	if (c == '0') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		a[now][make_pair(x[now], y[now])] = 0;
	}
	if (c == '1') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		a[now][make_pair(x[now], y[now])] = 1;
	}
	if (c == 'e') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		a[now].erase(make_pair(x[now], y[now]));
	}
	if (c == 'l') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		--x[now];
	}
	if (c == 'r') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		++x[now];
	}
	if (c == 'u') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		++y[now];
	}
	if (c == 'd') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
		--y[now];
	}
	if (c == 's') {
		++now;
		a[now] = a[now - 1]; x[now] = x[now - 1]; y[now] = y[now - 1];
	}
	if (c == 't') {
		int cnt = 0;
		if (a[now].count(make_pair(x[now], y[now]))) cnt = a[now][make_pair(x[now], y[now])] + 1;
		now = max(0, now - cnt);
	}
}

void print() {
	for (int j = 5; j >= -5; j--) {
		for (int i = -40; i <= 5; i++) {
			if (a[now].count(make_pair(i, j))) {
				if (i == x[now] && j == y[now]) {
					if (a[now][make_pair(i, j)] == 0) putchar('P');
					else putchar('Q');
				} else putchar(a[now][make_pair(i, j)] + '0');
			} else if (i == x[now] && j == y[now]) {
				putchar('#');
			} else {
				putchar('.');
			}
		}
		putchar('\n');
	}
}

int main() {
	int n, m;
	read(n); read(m);
	int nowpos = 0;
	while (n) {
		a[0][make_pair(nowpos, 1)] = n % 2;
		n /= 2; --nowpos;
	}
	nowpos = 0;
	while (m) {
		a[0][make_pair(nowpos, 0)] = m % 2;
		m /= 2; --nowpos;
	}
	print();
	while (1) {
		char c = getchar();
		while (!isdigit(c) && !isalpha(c)) c = getchar();
		doit(c);
		print();
	}
	return 0;
}
posted @ 2020-09-11 07:40  LJC00118  阅读(346)  评论(0编辑  收藏  举报
/*
*/