Cod sursa(job #18490)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 18 februarie 2007 12:25:07
Problema Amlei Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.39 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int N_MAX = 56;
const int T_MAX = 512;

int v1[N_MAX * T_MAX], v2[N_MAX * T_MAX];
long long rez1[T_MAX], rez2[T_MAX];

int main()
{
	freopen("amlei.in", "r", stdin);
	freopen("amlei.out", "w", stdout);

	int N, T, U, i, j;
	while (scanf("%d %d %d\n", &N, &T, &U) != EOF) {
		memset(rez1, 0, sizeof(rez1));
		memset(rez2, 0, sizeof(rez2));
		for (i = 1; i <= N * T; i ++) {
			scanf("%d ", &v1[i]);
		}
		for (i = 1; i <= N * U; i ++) {
			scanf("%d ", &v2[i]);
		}

		int k = 1;
		for (i = 1; i <= T * N; i += N) {
			for (j = i; j < i + N; j ++) {
				if (v1[j] > 0) {
					rez1[k] |= (1 << (v1[j] % 64));
				}
			}
			k ++;
		}

		k = 1;
		for (i = 1; i <= U * N; i += N) {
			for (j = i; j < i + N; j ++) {
				if (v2[j] > 0) {
					rez2[k] |= (1 << (v2[j] % 64));
				}
			}
			k ++;
		}

		sort(rez1 + 1, rez1 + T + 1);
		sort(rez2 + 1, rez2 + U + 1);

		for (i = 2; i <= T; i ++) {
			if (rez1[i] == rez1[i - 1]) {
				rez1[i] = -1;
			}
		}
		for (i = 2; i <= U; i ++) {
			if (rez2[i] == rez2[i - 1]) {
				rez2[i] = -1;
			}
		}

		for (i = 0, j = 0; i <= T && j <= U;) {
			while (rez1[i] == -1) {
				i ++;
			}
			while (rez2[j] == -1) {
				j ++;
			}
			if (rez1[i] != rez2[j]) {
				printf("NU\n");
				break;
			} else {
				i ++, j ++;
			}
		}
		if (i == T + 1 && j == U + 1) {
			printf("DA\n");
		}
	}

	return 0;
}