Submission #1190309

#TimeUsernameProblemLanguageResultExecution timeMemory
1190309TobIli (COI17_ili)C++20
100 / 100
791 ms79184 KiB
#include <bits/stdc++.h>

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)

using namespace std;

typedef long long ll;
typedef pair <ll, ll> pii;

const int N = 1e4 + 7;

int n, m;
string a;
int c[2*N];
int adj[N][2];
bool co[N][N], d[N];

int main () {
	FIO;
	cin >> n >> m >> a;
	
	memset(c, -1, sizeof c);
	for (int i = 0; i < m; i++) if (a[i] != '?') c[i+n] = a[i]-'0';
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < 2; j++) {
			char cc; cin >> cc;
			int x; cin >> x; x--;
			if (cc == 'x') adj[i][j] = x;
			else adj[i][j] = x+n;
		}
	}
	for (int i = m-1; i >= 0; i--) if (!c[i+n]) {
		c[adj[i][0]] = c[adj[i][1]] = 0;
		a[i] = '0';
	}
	for (int i = 0; i < m; i++) if (!c[adj[i][0]] && !c[adj[i][1]]) {
		c[i+n] = 0;
		a[i] = '0';
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < 2; j++) if (c[adj[i][j]]) {
			if (adj[i][j] < n) co[i][adj[i][j]] = 1;
			if (adj[i][j] >= n) for (int k = 0; k < n; k++) co[i][k] |= co[adj[i][j]-n][k];
		}
	}
	for (int i = 0; i < m; i++) {
		fill(d, d+m, 0);
		d[i] = 1;
		for (int j = 0; j < m; j++) {
			d[j] = 1;
			for (int k = 0; k < 2; k++) if (c[adj[j][k]]) {
				if ((adj[j][k] >= n && !d[adj[j][k]-n]) || (adj[j][k] < n && !co[i][adj[j][k]])) d[j] = 0;
			}
			if (d[j] && c[j+n] == 1) c[i+n] = 1;
		}
		if (c[i+n] == 1) a[i] = '1';
	}
	cout << a;

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...