输出两行,第一行包含一个只有0、1、&、|和^组成的字符串。其长度小于500,第二行只有一个布尔值,代表desired。
输出一个整数,表示取模后的答案。
1^0|0|1 false
2
1^((0|0)|1)和1^(0|(0|1))可以得到false
1 false
0
时间复杂度,空间复杂度
。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdbool.h>
#define MOD 1000000007
typedef unsigned long long ull;
bool isValid(char *exp, int len) {
if (len % 2 == 0) {
return false;
}
for (int i = 0; i < len; i += 2) {
if (exp[i] != '0' && exp[i] != '1') {
return false;
}
}
for (int i = 1; i < len; i += 2) {
if (exp[i] != '&' && exp[i] != '|' && exp[i] != '^') {
return false;
}
}
return true;
}
int main(void) {
char exp[501], desStr[6];
int len;
bool des;
scanf("%s%s", exp, desStr);
len = strlen(exp);
des = strcmp(desStr, "true") == 0;
if (!isValid(exp, len)) {
printf("0\n");
return 0;
}
ull **t, **f;
t = (ull **) malloc(sizeof(ull *) * len);
f = (ull **) malloc(sizeof(ull *) * len);
for (int i = 0; i < len; i++) {
t[i] = (ull *) calloc(len, sizeof(ull));
f[i] = (ull *) calloc(len, sizeof(ull));
}
t[0][0] = exp[0] == '1' ? 1 : 0;
f[0][0] = exp[0] == '0' ? 1 : 0;
for (int i = 2; i < len; i += 2) {
t[i][i] = exp[i] == '1' ? 1 : 0;
f[i][i] = exp[i] == '0' ? 1 : 0;
for (int j = i - 2; j >= 0; j -= 2) {
for (int k = j; k < i; k += 2) {
if (exp[k + 1] == '&') {
t[j][i] = (t[j][i] + (t[j][k] * t[k + 2][i]) % MOD) % MOD;
f[j][i] = (f[j][i] + (t[j][k] * f[k + 2][i]) % MOD) % MOD;
f[j][i] = (f[j][i] + (f[j][k] * t[k + 2][i]) % MOD) % MOD;
f[j][i] = (f[j][i] + (f[j][k] * f[k + 2][i]) % MOD) % MOD;
} else if (exp[k + 1] == '|') {
t[j][i] = (t[j][i] + (t[j][k] * f[k + 2][i]) % MOD) % MOD;
t[j][i] = (t[j][i] + (f[j][k] * t[k + 2][i]) % MOD) % MOD;
t[j][i] = (t[j][i] + (t[j][k] * t[k + 2][i]) % MOD) % MOD;
f[j][i] = (f[j][i] + (f[j][k] * f[k + 2][i]) % MOD) % MOD;
} else {
t[j][i] = (t[j][i] + (t[j][k] * f[k + 2][i]) % MOD) % MOD;
t[j][i] = (t[j][i] + (f[j][k] * t[k + 2][i]) % MOD) % MOD;
f[j][i] = (f[j][i] + (t[j][k] * t[k + 2][i]) % MOD) % MOD;
f[j][i] = (f[j][i] + (f[j][k] * f[k + 2][i]) % MOD) % MOD;
}
}
}
}
printf("%llu\n", des ? t[0][len - 1] : f[0][len - 1]);
return 0;
}