90求调,下wa 2 上wa 1
查看原帖
90求调,下wa 2 上wa 1
947873
RedWen_shuo楼主2024/7/17 17:19

用奇怪的并查集的方式做的

每进行一次运算就用并查集合并

#include<bits/stdc++.h>
#define ll int

using namespace std;

struct re{
	ll l, r, o;
};

vector<re> work;
ll num[3000000][100], p = 0;
string s, t;

ll find(ll x){
	if (x != num[x][0]) num[x][0] = find(num[x][0]);
	return num[x][0];
}

//map<string, ll> m;


int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	getline(cin,s);
	
	string h;
	s += " ";
	ll u = 0, b = 0;
	for (int i = 0; i <= s.size(); i ++) num[i][0] = i;
	
	for (int i = 0; i <= s.size(); i ++){
		if (s[i] == ' '){ 
			if (h == "true"){
				p ++;
				num[p][1] = 1;
				if (u == 1) b = 1; 
				u = 1;
			}else if (h == "false"){
				p ++;
				num[p][1] = 0;
				if (u == 1) b = 1; 
				u = 1;
			}else if (h == "and"){
				work.push_back((re){p, p + 1, 1});
				if (u == 0) b = 1; 
				u = 0;
			}else if (h == "or"){
				work.push_back((re){p, p + 1, 2});
				if (u == 0) b = 1; 
				u = 0;
			}else {
				work.push_back((re){p + 1, p + 1, 0});
				u = 0;
			}
			t = h;
			h = "";
		}else {
			h += s[i];
		}
//		cout << h << "\n";
	}
	
//	if (t == "and" || t == "or" || t == "not") b = 1;
	
	if (b){ cout << "error"; return 0;}
	
	for (int k = 0; k < work.size(); k ++){
		if (work[k].o == 0){
			if (num[find(work[k].l)][1] == 1)
				num[find(work[k].l)][1] = 0;
			else num[find(work[k].l)][1] = 1;
		}
//		for (int i = 0; i <= p; i ++) cout << num[i][0] << " ";
//		cout << '\n';
	}
	for (int k = 0; k < work.size(); k ++){
		if (work[k].o == 1){
			if (num[find(work[k].l)][1] == 1 && num[find(work[k].r)][1] == 1){
				num[find(work[k].l)][1] = 1;
				num[find(work[k].r)][1] = 1;
				num[find(work[k].l)][0] = find(num[work[k].r][0]);
			}else {
				num[find(work[k].l)][1] = 0;
				num[find(work[k].r)][1] = 0;
				num[find(work[k].l)][0] = find(num[work[k].r][0]);
			}
		}
//		for (int i = 0; i <= p; i ++) cout << num[i][0] << " ";
//		cout << '\n';
	}
	ll j;
	for (int k = 0; k < work.size(); k ++){
		if (work[k].o == 2){
			if (num[find(work[k].l)][1] == 1 && num[find(work[k].r)][1] == 1 || num[find(work[k].l)][1] == 0 && num[find(work[k].r)][1] == 1 || num[find(work[k].l)][1] == 1 && num[find(work[k].r)][1] == 0){
				num[find(work[k].l)][1] = 1;
				num[find(work[k].r)][1] = 1;
				num[find(work[k].l)][0] = find(num[work[k].r][0]);
			}else {
				num[find(work[k].l)][1] = 0;
				num[find(work[k].r)][1] = 0;
				num[find(work[k].l)][0] = find(num[work[k].r][0]);
			}
			j = work[k].l;
		}
//		for (int i = 0; i <= p; i ++) cout << num[i][0] << " ";
//		cout << '\n';
	}
//	cout << p <<"\n";
//	for (int i = 0; i <= p; i ++) cout << num[find(i)][0] << " ";
	
	if (num[find(1)][1] == 1) cout << "true";
	else cout << "false"; 
	
	return 0;
}

2024/7/17 17:19
加载中...