#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
replace(char firstString[], char secondString[], char thirdString[]);
char expression[1001], copyExp[1001];
int boolVar[26];
int main(){
FILE *file1, *file2;
int i=-1, j=0, k=0, nChanges;
char ch[2], val[2], letters[101];
file1 = fopen("bool.in", "r");
file2 = fopen("bool.out", "w");
while(1){
expression[++i] = fgetc(file1);
if(expression[i]=='\n'){
expression[i] = '\0';
break;
}
}
fscanf(file1, "%d", &nChanges);
fscanf(file1, " %s", letters);
for(i=0; i<nChanges; i++)
letters[i] = toupper(letters[i]);
printf("%s", letters);
replace("TRUE", "1", expression);
replace("FALSE", "0", expression);
replace("AND", "&", expression);
replace("OR", "|", expression);
replace("NOT", "-", expression);
replace(" ", "", expression);
strcpy(copyExp, expression);
while(nChanges){
strcpy(expression, copyExp);
boolVar[letters[j++] - 'A'] = 1 - boolVar[letters[j] - 'A'];
for(i=0; i<strlen(copyExp); i++){
if(isalpha(copyExp[i])){
ch[0] = copyExp[i]; ch[1] = '\0';
val[0] = (boolVar[copyExp[i] - 'A'] + '0'); val[1] = '\0';
replace(ch, val, expression);
}
}
while(1){
replace("-0", "1", expression);
replace("-1", "0", expression);
//printf("%s\n", expression);
replace("0&0", "0", expression);
replace("0&1", "0", expression);
replace("1&0", "0", expression);
replace("1&1", "1", expression);
//printf("%s\n", expression);
replace("0|0", "0", expression);
replace("0|1", "1", expression);
replace("1|0", "1", expression);
replace("1|1", "1", expression);
//printf("%s\n", expression);
replace("(1)", "1", expression);
replace("(0)", "0", expression);
//printf("%s\n", expression);
if(strlen(expression)==1)
break;
}
fprintf(file2, "%c", expression[0]);
nChanges--;
}
return 0;
}
replace(char firstString[], char secondString[], char thirdString[]){
char newString[1000];
int i, j, k, len1, len2, len3, result=-1;
len1 = strlen(firstString);
len2 = strlen(secondString);
len3 = strlen(thirdString);
for(i=0; i<=len3-len1; i++){
if(thirdString[i]==firstString[0]){
for(j=0; j<len1; j++){
if(firstString[j]!=thirdString[i+j])
break;
}
if(j==len1){
result = i;
}
}
}
if(result!=-1){
while(result!=-1){
for(i=0; i<result; i++){
newString[i] = thirdString[i];
}
for(j=0; j<len2; j++){
newString[i++] = secondString[j];
}
for(k=result+len1; k<len3+abs(len2-len1); k++){
newString[i++] = thirdString[k];
}
newString[i] = '\0';
strcpy(thirdString, newString);
result = -1;
len1 = strlen(firstString);
len2 = strlen(secondString);
len3 = strlen(thirdString);
for(i=0; i<=len3-len1; i++){
if(thirdString[i]==firstString[0]){
for(j=0; j<len1; j++){
if(firstString[j]!=thirdString[i+j])
break;
}
if(j==len1){
result = i;
}
}
}
}
strcpy(expression, thirdString);
}
}