为啥暴力模拟+合并+随机数过70pts
查看原帖
为啥暴力模拟+合并+随机数过70pts
1188058
141300hxl楼主2023/11/15 15:22
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> door;
int n, m, x, ans;
string str;
inline int read() {
	int data = 0;
	char ch = getchar();
	for (; '0' > ch || ch > '9'; ch = getchar());
	for (; '0' <= ch && ch <= '9'; ch = getchar())
		data = data * 10 + ch - '0';
	return data;
}
int main() {
	srand((int)(time(NULL)));
	n = read();
	m = read();
	for (int i = 1; i <= n; i++) {
		cin >> str ;
		x = read();
		if (str == "AND")
			door.push_back({1, x});
		else if (str == "OR")
			door.push_back({2, x});
		else if (str == "XOR")
			door.push_back({3, x});
	}
	door.erase(remove(door.begin(), door.end(), pair<int, int> {2, 0}), door.end());
	door.erase(remove(door.begin(), door.end(), pair<int, int> {3, 0}), door.end());
	for (auto it = door.begin(); it + 1 != door.end(); it++)
		if ((*it).first == (*(it + 1)).first) { // 相同优先级 可改变运算顺序
			int t = (*it).second;
			if ((*(it + 1)).first == 1)
				(*(it + 1)).second &= t;
			if ((*(it + 1)).first == 2)
				(*(it + 1)).second |= t;
			if ((*(it + 1)).first == 3)
				(*(it + 1)).second ^= t;
			door.erase(it);
			it--;
		}
	door.erase(remove(door.begin(), door.end(), pair<int, int> {2, 0}), door.end());
	door.erase(remove(door.begin(), door.end(), pair<int, int> {3, 0}), door.end());
	for (auto it = door.begin(); it + 1 != door.end(); it++) {
		int op = it->first;
		int op2 = (it + 1)->first;
		int t2 = it->second;
		if ((op == 1 && op2 == 2) || (op == 2 && op2 == 1)) // (x or m) and m == (x and m) or m == m
			if (t2 == (it + 1)->second) {
				(it + 1)->first = 4;
				door.erase(it);
				it--;
			}

	}
	n = door.size() - 1;
	int i, sum = 0;
	for (i = n; i >= 0; i--)
		if (door[i].first == 4) break;
	sum = door[i].second;
	if (i != -1) {
		for (auto it = door.begin() + i + 1; it != door.end(); it++) {
			int t = it->second, op = it->first;
			if (op == 1) sum &= t;
			if (op == 2) sum |= t;
			if (op == 3) sum ^= t;
		}
		cout << sum;
	}

	for (int i = 0; i <= 101; i++) {
		int tmp = rand() % (m + 1);
		for (auto p : door) {
			int op = p.first;
			int t = p.second;
			if (op == 1)
				tmp &= t;
			else if (op == 2)
				tmp |= t;
			else if (op == 3)
				tmp ^= t;
			else if (op == 4)
				tmp = t;
		}
		ans = max(ans, tmp);
	}

	cout << ans;
	return 0;
}
2023/11/15 15:22
加载中...