Cod sursa(job #658656)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 9 ianuarie 2012 11:40:04
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>
#include <cstring>
#include <stdlib.h>

char SO[101], S[101], schimb[1001];
long n, LIT[28], i;

void replace(char S[101], char ce[10], char cu[10]) {
	
	char *p;
	char t[105];
	p = strstr(S, ce);

	while (p != 0) {
		strcpy(t, p);
		strcpy(p, cu);
		strcpy(p+strlen(cu), t+strlen(ce));
		p = strstr(p, ce);
	}

}

void erase(char S[101], char ce[10]) {
	
	char *p;
	p = strstr(S, ce);

	while (p != 0) {
		strcpy(p, p+strlen(ce));
		p = strstr(p, ce);
	}

}

int rez(char S[101]) {
	long t, i;
	char x[5] = "", y[5]="";
	for (i = 0; i <= 27; ++i) {
		x[0] = (char)(i+'A');
		y[0] = (char)(LIT[i]+'0');
		replace(S, x, y);
	}
	while ((t=strlen(S)) != 1) {
		replace(S, "!0", "1");
		replace(S, "!1", "0");

		if (strlen(S) == t) {
			replace(S, "0&0", "0");
			replace(S, "0&1", "0");
			replace(S, "1&1", "1");
			replace(S, "1&0", "0");

			if(strlen(S) == t) {
				replace(S, "0|0", "0");
				replace(S, "0|1", "1");
				replace(S, "1|1", "1");
				replace(S, "1|0", "1");				
			}
		}
		t = 0;
		while (t != strlen(S)) {
			t = strlen(S);
			replace(S, "(0)", "0");
			replace(S, "(1)", "1");
		}
		
	}
	return S[0] - '0';
}

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

		gets(SO);
		scanf("%ld\n", &n);
		scanf("%s\n", schimb);

		replace(SO, "NOT", "!");
		replace(SO, "NOT", "!");
		replace(SO, "AND", "&");
		replace(SO, "OR", "|");
		replace(SO, "TRUE", "1");
		replace(SO, "FALSE", "0");
		erase(SO, " ");

		for (i = 0; i < n; ++i) {
			LIT[ schimb[i] - 'A' ] = 1 - LIT[ schimb[i] - 'A' ];
			strcpy(S, SO);
			printf("%ld", rez(SO));
			strcpy(SO, S);
		}
		printf("\n");
	return 0;
}