Cod sursa(job #1741780)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 15 august 2016 01:29:42
Problema Amlei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream fin("amlei.in");
ofstream fout("amlei.out");

class Conjunction {

private:

	vector<bool> value;

public:

	Conjunction(vector<int> variables) {

		value.resize(variables.size() + 1, false);
		for (auto& var : variables)
			if (var > 0)
				value[var] = true;

	}

	bool operator < (const Conjunction& obj) const {

		return value < obj.value;

	}

	bool operator == (Conjunction& obj) const {

		return value == obj.value;

	}

};

class DisjunctionOfConjunctions {

private:

	vector<Conjunction> conjunctions;

	void Sort(void) {

		sort(conjunctions.begin(), conjunctions.end());

	}

	void Unique(void) {

		Sort();
		conjunctions.erase(unique(conjunctions.begin(), conjunctions.end()), conjunctions.end());

	}

public:

	DisjunctionOfConjunctions(int varCount, int conjCount, vector<int> data) {
	
		vector<int> curVar;
		for (int i = 0; i < (int)data.size(); i += varCount) {

			curVar.clear();
			for (int j = i; j < i + varCount; ++j)
				curVar.push_back(data[j]);
			conjunctions.push_back(Conjunction(curVar));

		}
	
	}

	bool Equal(DisjunctionOfConjunctions& obj) {

		Unique(); obj.Unique();

		if (conjunctions.size() != obj.conjunctions.size())
			return false;
		for (int i = 0; i < (int)conjunctions.size(); ++i) {
			if (!(conjunctions[i] == obj.conjunctions[i]))
				return false;
		}

		return true;

	}

};

int main() {

	int varCount, conjCount1, conjCount2;
	while (fin >> varCount >> conjCount1 >> conjCount2) {

		vector<int> cur;
		for (int i = 1; i <= varCount * conjCount1; ++i) {
			int x; fin >> x;
			cur.push_back(x);
		}
		DisjunctionOfConjunctions first(varCount, conjCount1, cur);

		cur.clear();
		for (int i = 1; i <= varCount * conjCount2; ++i) {
			int x; fin >> x;
			cur.push_back(x);
		}
		DisjunctionOfConjunctions second(varCount, conjCount2, cur);

		fout << (first.Equal(second) ? "DA" : "NU") << '\n';

	}

	return 0;

}

//Trust me, I'm the Doctor!